Skip to content

Instantly share code, notes, and snippets.

@AppleBetas
Last active April 13, 2019 19:06
Show Gist options
  • Save AppleBetas/e08cc34763500907fb2681facf1d948a to your computer and use it in GitHub Desktop.
Save AppleBetas/e08cc34763500907fb2681facf1d948a to your computer and use it in GitHub Desktop.
Device.swift - Cross-platform class for device model and model identifier information
//
// 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