170 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Swift
		
	
	
		
			Executable File
		
	
			
		
		
	
	
			170 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Swift
		
	
	
		
			Executable File
		
	
| //
 | |
| //  Constants.swift
 | |
| //  AgoraChatRoom
 | |
| //
 | |
| //  Created by LXH on 2019/11/27.
 | |
| //  Copyright © 2019 CavanSu. All rights reserved.
 | |
| //
 | |
| 
 | |
| import UIKit
 | |
| 
 | |
| internal struct Constants {
 | |
|     
 | |
|     private static let appVersion: String = {
 | |
|         guard let infoDict = Bundle.main.infoDictionary,
 | |
|               let currentVersion = infoDict["CFBundleShortVersionString"] as? String else {
 | |
|             return ""
 | |
|         }
 | |
|         return currentVersion
 | |
|     }()
 | |
|     
 | |
|     private static let appBundleIdentifier: String = {
 | |
|         guard let infoDictionary = Bundle.main.infoDictionary,
 | |
|               let shortVersion = infoDictionary["CFBundleIdentifier"] as? String else {
 | |
|             return ""
 | |
|         }
 | |
|         return shortVersion
 | |
|     }()
 | |
|     
 | |
|     private static let sdkVersion: String = {
 | |
|         guard let infoDict = Bundle(for: Manager.self).infoDictionary,
 | |
|               let currentVersion = infoDict["CFBundleShortVersionString"] as? String else {
 | |
|             return ""
 | |
|         }
 | |
|         return currentVersion
 | |
|     }()
 | |
|     
 | |
|     private static let preferredLocale: Locale = {
 | |
|         guard let preferredIdentifier = Locale.preferredLanguages.first else {
 | |
|             return Locale.current
 | |
|         }
 | |
|         return Locale(identifier: preferredIdentifier)
 | |
|     }()
 | |
|     
 | |
|     private static let countryCode: String = {
 | |
|         return preferredLocale.regionCode?.uppercased() ?? ""
 | |
|     }()
 | |
|     
 | |
|     private static let timeZone: String = {
 | |
|         return TimeZone.current.identifier
 | |
|     }()
 | |
|     
 | |
|     private static let languageCode: String = {
 | |
|         return preferredLocale.languageCode ?? ""
 | |
|     }()
 | |
|     
 | |
|     private static let localeCode: String = {
 | |
|         return preferredLocale.identifier
 | |
|     }()
 | |
|     
 | |
|     private static let modelName: String = {
 | |
|         return platform().deviceType.rawValue
 | |
|     }()
 | |
|     
 | |
|     private static let model: String = {
 | |
|         return hardwareString()
 | |
|     }()
 | |
|     
 | |
|     private static let systemVersion: String = {
 | |
|         return UIDevice.current.systemVersion
 | |
|     }()
 | |
|     
 | |
|     private static let screenSize: (w: CGFloat, h: CGFloat) = {
 | |
|         return (UIScreen.main.bounds.width, UIScreen.main.bounds.height)
 | |
|     }()
 | |
|     
 | |
|     /// 时区偏移毫秒数
 | |
|     private static let tzOffset: Int64 = {
 | |
|         return Int64(TimeZone.current.secondsFromGMT(for: Date())) * 1000
 | |
|     }()
 | |
|     
 | |
|     static var deviceInfo: [String : Any] {
 | |
|         return [
 | |
|             "country": countryCode,
 | |
|             "platform": "IOS",
 | |
|             "appId" : appBundleIdentifier,
 | |
|             "version" : appVersion,
 | |
|             "tzOffset": tzOffset,
 | |
|             "deviceType" : modelName,
 | |
|             "brand": "Apple",
 | |
|             "model": model,
 | |
|             "screenH": Int(screenSize.h),
 | |
|             "screenW": Int(screenSize.w),
 | |
|             "osVersion": systemVersion,
 | |
|             "language" : languageCode,
 | |
|             "sdkVersion" : sdkVersion,
 | |
|         ]
 | |
|     }
 | |
|     
 | |
|     /// This method returns the hardware type
 | |
|     ///
 | |
|     ///
 | |
|     /// - returns: raw `String` of device type, e.g. iPhone5,1
 | |
|     ///
 | |
|     private static func hardwareString() -> String {
 | |
|         var name: [Int32] = [CTL_HW, HW_MACHINE]
 | |
|         var size: Int = 2
 | |
|         sysctl(&name, 2, nil, &size, nil, 0)
 | |
|         var hw_machine = [CChar](repeating: 0, count: Int(size))
 | |
|         sysctl(&name, 2, &hw_machine, &size, nil, 0)
 | |
|         
 | |
|         var hardware: String = String(cString: hw_machine)
 | |
|         
 | |
|         // Check for simulator
 | |
|         if hardware == "x86_64" || hardware == "i386" || hardware == "arm64" {
 | |
|             if let deviceID = ProcessInfo.processInfo.environment["SIMULATOR_MODEL_IDENTIFIER"] {
 | |
|                 hardware = deviceID
 | |
|             }
 | |
|         }
 | |
|         
 | |
|         return hardware
 | |
|     }
 | |
|     
 | |
|     /// This method returns the Platform enum depending upon harware string
 | |
|     ///
 | |
|     ///
 | |
|     /// - returns: `Platform` type of the device
 | |
|     ///
 | |
|     static func platform() -> Platform {
 | |
|         
 | |
|         let hardware = hardwareString()
 | |
|         
 | |
|         if (hardware.hasPrefix("iPhone"))    { return .iPhone }
 | |
|         if (hardware.hasPrefix("iPod"))      { return .iPodTouch }
 | |
|         if (hardware.hasPrefix("iPad"))      { return .iPad }
 | |
|         if (hardware.hasPrefix("Watch"))     { return .appleWatch }
 | |
|         if (hardware.hasPrefix("AppleTV"))   { return .appleTV }
 | |
|         
 | |
|         return .unknown
 | |
|     }
 | |
|     
 | |
|     enum Platform {
 | |
|         case iPhone
 | |
|         case iPodTouch
 | |
|         case iPad
 | |
|         case appleWatch
 | |
|         case appleTV
 | |
|         case unknown
 | |
|         
 | |
|         enum DeviceType: String {
 | |
|             case mobile, tablet, desktop, smartTV, watch, other
 | |
|         }
 | |
|         
 | |
|         var deviceType: DeviceType {
 | |
|             switch self {
 | |
|             case .iPad:
 | |
|                 return .tablet
 | |
|             case .iPhone, .iPodTouch:
 | |
|                 return .mobile
 | |
|             case .appleTV:
 | |
|                 return .smartTV
 | |
|             case .appleWatch:
 | |
|                 return .watch
 | |
|             case .unknown:
 | |
|                 return .other
 | |
|             }
 | |
|         }
 | |
|     }
 | |
|     
 | |
| }
 |