Last active
April 13, 2019 19:06
-
-
Save AppleBetas/e08cc34763500907fb2681facf1d948a to your computer and use it in GitHub Desktop.
Device.swift - Cross-platform class for device model and model identifier information
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// Device.swift | |
// | |
// Created by AppleBetas on 2015-12-30. | |
// Copyright © 2015 AppleBetas. All rights reserved. | |
// | |
import Foundation | |
class Device { | |
let deviceModel: String | |
init(deviceModel: String) { | |
self.deviceModel = deviceModel | |
} | |
convenience init() { | |
self.init(deviceModel: Device.getDeviceModel()) | |
} | |
class func getDeviceModel() -> String { | |
var systemInfo = utsname() | |
uname(&systemInfo) | |
let machineMirror = Mirror(reflecting: systemInfo.machine) | |
let identifier = machineMirror.children.reduce("") { identifier, element in | |
guard let value = element.value as? Int8, value != 0 else { return identifier } | |
return identifier + String(UnicodeScalar(UInt8(value))) | |
} | |
return identifier | |
} | |
func getDeviceName(extra: Bool) -> String { | |
let platform = self.deviceModel | |
let deviceNamesByCode = [ | |
// Simulators | |
"x86_64": "64-bit Simulator", | |
"i386": "32-bit Simulator", | |
// iPod touches | |
"iPod1,1": "iPod touch 1", | |
"iPod2,1": "iPod touch 2", | |
"iPod3,1": "iPod touch 3", | |
"iPod4,1": "iPod touch 4", | |
"iPod5,1": "iPod touch 5", | |
"iPod7,1": "iPod touch 6", | |
// iPads | |
"iPad1,1": "iPad 1", | |
"iPad2,1": extra ? "iPad 2 (Wi-Fi)" : "iPad 2", | |
"iPad2,2": extra ? "iPad 2 (Wi-Fi/GSM)" : "iPad 2", | |
"iPad2,3": extra ? "iPad 2 (Wi-Fi/CDMA)" : "iPad 2", | |
"iPad2,4": extra ? "iPad 2 (Wi-Fi/Rev A)" : "iPad 2", | |
"iPad3,1": extra ? "iPad 3 (Wi-Fi)" : "iPad 3", | |
"iPad3,2": extra ? "iPad 3 (Wi-Fi/GSM/CDMA)" : "iPad 3", | |
"iPad3,3": extra ? "iPad 3 (Wi-Fi/GSM)" : "iPad 3", | |
"iPad3,4": extra ? "iPad 4 (Wi-Fi)" : "iPad 4", | |
"iPad3,5": extra ? "iPad 4 (Wi-Fi/GSM)" : "iPad 4", | |
"iPad3,6": extra ? "iPad 4 (Wi-Fi/GSM/CDMA)" : "iPad 4", | |
"iPad4,1": extra ? "iPad Air (Wi-Fi)" : "iPad Air", | |
"iPad4,2": extra ? "iPad Air (Wi-Fi/Cellular)" : "iPad Air", | |
"iPad4,3": extra ? "iPad Air (Wi-Fi/China Cellular)" : "iPad Air", | |
"iPad5,3": extra ? "iPad Air 2 (Wi-Fi)" : "iPad Air 2", | |
"iPad5,4": extra ? "iPad Air 2 (Wi-Fi/Cellular)" : "iPad Air 2", | |
"iPad2,5": extra ? "iPad mini 1 (Wi-Fi)" : "iPad mini 1", | |
"iPad2,6": extra ? "iPad mini 1 (Wi-Fi/GSM/CDMA)" : "iPad mini 1", | |
"iPad2,7": extra ? "iPad mini 1 (Wi-Fi/GSM)" : "iPad mini 1", | |
"iPad4,4": extra ? "iPad mini 2 (Wi-Fi)" : "iPad mini 2", | |
"iPad4,5": extra ? "iPad mini 2 (Wi-Fi/Cellular)" : "iPad mini 2", | |
"iPad4,6": extra ? "iPad mini 2 (Wi-Fi/China Cellular)" : "iPad mini 2", | |
"iPad4,7": extra ? "iPad mini 3 (Wi-Fi)" : "iPad mini 3", | |
"iPad4,8": extra ? "iPad mini 3 (Wi-Fi/Cellular)" : "iPad mini 3", | |
"iPad4,9": extra ? "iPad mini 3 (Wi-Fi/China Cellular)" : "iPad mini 3", | |
"iPad5,1": extra ? "iPad mini 4 (Wi-Fi)" : "iPad mini 4", | |
"iPad5,2": extra ? "iPad mini 4 (Wi-Fi/Cellular)" : "iPad mini 4", | |
"iPad6,7": extra ? "iPad Pro (Wi-Fi, 12.9-inch)" : "iPad Pro", | |
"iPad6,8": extra ? "iPad Pro (Wi-Fi/Cellular, 12.9-inch)" : "iPad Pro", | |
"iPad6,3": extra ? "iPad Pro (Wi-Fi, 9.7-inch)" : "iPad Pro", | |
"iPad6,4": extra ? "iPad Pro (Wi-Fi/Cellular, 9.7-inch)" : "iPad Pro", | |
"iPad6,11": extra ? "iPad 5 (Wi-Fi, 9.7-inch)" : "iPad 5", | |
"iPad6,12": extra ? "iPad 5 (Wi-Fi/Cellular, 9.7-inch)" : "iPad 5", | |
"iPad7,1": extra ? "iPad Pro (2nd-generation) [Wi-Fi, 12.9-inch]" : "iPad Pro (2nd-generation)", | |
"iPad7,2": extra ? "iPad Pro (2nd-generation) [Wi-Fi/Cellular, 12.9-inch]" : "iPad Pro (2nd-generation)", | |
"iPad7,3": extra ? "iPad Pro (2nd-generation) [Wi-Fi, 10.5-inch]" : "iPad Pro (2nd-generation)", | |
"iPad7,4": extra ? "iPad Pro (2nd-generation) [Wi-Fi/Cellular, 10.5-inch]" : "iPad Pro (2nd-generation)", | |
"iPad7,5": extra ? "iPad 6 (Wi-Fi)" : "iPad 6", | |
"iPad7,6": extra ? "iPad 6 (Wi-Fi/Cellular)" : "iPad 6", | |
"iPad8,1": extra ? "iPad Pro (3rd-generation) [Wi-Fi, 11-inch]" : "iPad Pro (3rd-generation)", | |
"iPad8,2": extra ? "iPad Pro (3rd-generation) [Wi-Fi, 11-inch]" : "iPad Pro (3rd-generation)", | |
"iPad8,3": extra ? "iPad Pro (3rd-generation) [Wi-Fi/Cellular, 11-inch]" : "iPad Pro (3rd-generation)", | |
"iPad8,4": extra ? "iPad Pro (3rd-generation) [Wi-Fi/Cellular, 11-inch]" : "iPad Pro (3rd-generation)", | |
"iPad8,5": extra ? "iPad Pro (3rd-generation) [Wi-Fi, 12.9-inch]" : "iPad Pro (3rd-generation)", | |
"iPad8,6": extra ? "iPad Pro (3rd-generation) [Wi-Fi, 12.9-inch]" : "iPad Pro (3rd-generation)", | |
"iPad8,7": extra ? "iPad Pro (3rd-generation) [Wi-Fi/Cellular, 12.9-inch]" : "iPad Pro (3rd-generation)", | |
"iPad8,8": extra ? "iPad Pro (3rd-generation) [Wi-Fi/Cellular, 12.9-inch]" : "iPad Pro (3rd-generation)", | |
"iPad11,1": extra ? "iPad mini 5 (Wi-Fi)" : "iPad mini 5", | |
"iPad11,2": extra ? "iPad mini 5 (Wi-Fi/Cellular)" : "iPad mini 5", | |
"iPad11,3": extra ? "iPad Air 3 (Wi-Fi)" : "iPad Air 3", | |
"iPad11,4": extra ? "iPad Air 3 (Wi-Fi/Cellular)" : "iPad Air 3", | |
// iPhones | |
"iPhone1,1": "iPhone 1", | |
"iPhone1,2": "iPhone 3G", | |
"iPhone2,1": "iPhone 3GS", | |
"iPhone3,1": extra ? "iPhone 4 (GSM)" : "iPhone 4", | |
"iPhone3,2": extra ? "iPhone 4 (GSM/2012)" : "iPhone 4", | |
"iPhone3,3": extra ? "iPhone 4 (CDMA)" : "iPhone 4", | |
"iPhone4,1": "iPhone 4s", | |
"iPhone5,1": "iPhone 5", | |
"iPhone5,2": "iPhone 5", | |
"iPhone5,3": "iPhone 5c", | |
"iPhone5,4": "iPhone 5c", | |
"iPhone6,1": "iPhone 5s", | |
"iPhone6,2": "iPhone 5s", | |
"iPhone7,2": "iPhone 6", | |
"iPhone7,1": "iPhone 6 Plus", | |
"iPhone8,1": "iPhone 6s", | |
"iPhone8,2": "iPhone 6s Plus", | |
"iPhone8,4": "iPhone SE", | |
"iPhone9,1": "iPhone 7", | |
"iPhone9,2": "iPhone 7 Plus", | |
"iPhone9,3": "iPhone 7", | |
"iPhone9,4": "iPhone 7 Plus", | |
"iPhone10,1": "iPhone 8", | |
"iPhone10,2": "iPhone 8 Plus", | |
"iPhone10,3": "iPhone X", | |
"iPhone10,4": "iPhone 8", | |
"iPhone10,5": "iPhone 8 Plus", | |
"iPhone10,6": "iPhone X", | |
"iPhone11,2": "iPhone Xs", | |
"iPhone11,6": "iPhone Xs Max", | |
"iPhone11,8": "iPhone Xʀ", | |
// Apple TVs | |
"AppleTV2,1": "Apple TV 2", | |
"AppleTV3,1": "Apple TV 3", | |
"AppleTV3,2": extra ? "Apple TV 3 (Rev A)" : "Apple TV 3", | |
"AppleTV5,3": "Apple TV 4", | |
"AppleTV6,2": "Apple TV 4K", | |
// Apple Watches | |
"Watch1,1": extra ? "Apple Watch (38mm)" : "Apple Watch", | |
"Watch1,2": extra ? "Apple Watch (42mm)" : "Apple Watch", | |
"Watch2,6": extra ? "Apple Watch Series 1 (38mm)" : "Apple Watch Series 1", | |
"Watch2,7": extra ? "Apple Watch Series 1 (42mm)" : "Apple Watch Series 1", | |
"Watch2,3": extra ? "Apple Watch Series 2 (38mm)" : "Apple Watch Series 2", | |
"Watch2,4": extra ? "Apple Watch Series 2 (42mm)" : "Apple Watch Series 2", | |
"Watch3,1": extra ? "Apple Watch Series 3 (Cellular, 38mm)" : "Apple Watch Series 3", | |
"Watch3,2": extra ? "Apple Watch Series 3 (Cellular, 42mm)" : "Apple Watch Series 3", | |
"Watch3,3": extra ? "Apple Watch Series 3 (GPS, 38mm)" : "Apple Watch Series 3", | |
"Watch3,4": extra ? "Apple Watch Series 3 (GPS, 42mm)" : "Apple Watch Series 3", | |
"Watch4,1": extra ? "Apple Watch Series 4 (Cellular, 40mm)" : "Apple Watch Series 4", | |
"Watch4,2": extra ? "Apple Watch Series 4 (Cellular, 44mm)" : "Apple Watch Series 4", | |
"Watch4,3": extra ? "Apple Watch Series 4 (GPS, 40mm)" : "Apple Watch Series 4", | |
"Watch4,4": extra ? "Apple Watch Series 4 (GPS, 44mm)" : "Apple Watch Series 4", | |
// HomePod | |
"AudioAccessory1,1": "HomePod" | |
] | |
if let deviceName = deviceNamesByCode[platform] { | |
return deviceName | |
} | |
return self.getDeviceFamily() | |
} | |
func getDeviceFamily() -> String { | |
let platform = self.deviceModel | |
let deviceFamilyByCodeStart = [ | |
"iPhone": "iPhone", | |
"iPod": "iPod", | |
"iPad": "iPad", | |
"AppleTV": "Apple TV", | |
"Watch": "Apple Watch", | |
"Mac": "PowerMac", | |
"PowerBook": "PowerBook", | |
"iMac": "iMac", | |
"Macmini": "Mac mini", | |
"MacPro": "Mac Pro", | |
"MacBook Air": "MacBook Air", | |
"MacBook Pro": "MacBook Pro", | |
"MacBook": "MacBook", | |
"RackMac": "Xserve", | |
"Xserve": "Xserve", | |
"AudioAccessory": "HomePod" | |
] | |
for (deviceFamilyID, deviceFamily) in deviceFamilyByCodeStart { | |
if platform.hasPrefix(deviceFamilyID) { | |
return deviceFamily | |
} | |
} | |
return platform | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment