Skip to content

Instantly share code, notes, and snippets.

@danielgehr
Created January 12, 2018 08:57
Show Gist options
  • Save danielgehr/f5e8b6a7792bf4697ef81be29d24de2b to your computer and use it in GitHub Desktop.
Save danielgehr/f5e8b6a7792bf4697ef81be29d24de2b to your computer and use it in GitHub Desktop.
UIDevice Swift extension to determine the device an app is running on
import Foundation
import UIKit
public enum Model: String {
case simulator = "simulator/sandbox",
iPod1 = "iPod 1",
iPod2 = "iPod 2",
iPod3 = "iPod 3",
iPod4 = "iPod 4",
iPod5 = "iPod 5",
iPad2 = "iPad 2",
iPad3 = "iPad 3",
iPad4 = "iPad 4",
iPhone4 = "iPhone 4",
iPhone4S = "iPhone 4S",
iPhone5 = "iPhone 5",
iPhone5S = "iPhone 5S",
iPhone5C = "iPhone 5C",
iPadMini1 = "iPad Mini 1",
iPadMini2 = "iPad Mini 2",
iPadMini3 = "iPad Mini 3",
iPadMini4 = "iPad Mini 4",
iPadAir1 = "iPad Air 1",
iPadAir2 = "iPad Air 2",
iPadPro9_7 = "iPad Pro 9.7\"",
iPadPro9_7_cell = "iPad Pro 9.7\" cellular",
iPadPro10_5 = "iPad Pro 10.5\"",
iPadPro10_5_cell = "iPad Pro 10.5\" cellular",
iPadPro12_9 = "iPad Pro 12.9\"",
iPadPro12_9_cell = "iPad Pro 12.9\" cellular",
iPhone6 = "iPhone 6",
iPhone6plus = "iPhone 6 Plus",
iPhone6S = "iPhone 6S",
iPhone6Splus = "iPhone 6S Plus",
iPhoneSE = "iPhone SE",
iPhone7 = "iPhone 7",
iPhone7plus = "iPhone 7 Plus",
iPhone8 = "iPhone 8",
iPhone8plus = "iPhone 8 Plus",
iPhoneX = "iPhone X",
unrecognized = "?unrecognized?"
}
public extension UIDevice {
private var modelCode: String? {
var systemInfo = utsname()
uname(&systemInfo)
let modelCode = withUnsafePointer(to: &systemInfo.machine) {
$0.withMemoryRebound(to: CChar.self, capacity: 1) { ptr in
String.init(validatingUTF8: ptr)
}
}
return modelCode
}
public var type: Model {
var modelMap : [ String : Model ] = [
"i386": .simulator,
"x86_64": .simulator,
"iPod1,1": .iPod1,
"iPod2,1": .iPod2,
"iPod3,1": .iPod3,
"iPod4,1": .iPod4,
"iPod5,1": .iPod5,
"iPad2,1": .iPad2,
"iPad2,2": .iPad2,
"iPad2,3": .iPad2,
"iPad2,4": .iPad2,
"iPad2,5": .iPadMini1,
"iPad2,6": .iPadMini1,
"iPad2,7": .iPadMini1,
"iPhone3,1": .iPhone4,
"iPhone3,2": .iPhone4,
"iPhone3,3": .iPhone4,
"iPhone4,1": .iPhone4S,
"iPhone5,1": .iPhone5,
"iPhone5,2": .iPhone5,
"iPhone5,3": .iPhone5C,
"iPhone5,4": .iPhone5C,
"iPad3,1": .iPad3,
"iPad3,2": .iPad3,
"iPad3,3": .iPad3,
"iPad3,4": .iPad4,
"iPad3,5": .iPad4,
"iPad3,6": .iPad4,
"iPhone6,1": .iPhone5S,
"iPhone6,2": .iPhone5S,
"iPad4,1": .iPadAir1,
"iPad4,2": .iPadAir2,
"iPad4,4": .iPadMini2,
"iPad4,5": .iPadMini2,
"iPad4,6": .iPadMini2,
"iPad4,7": .iPadMini3,
"iPad4,8": .iPadMini3,
"iPad4,9": .iPadMini3,
"iPad5,1": .iPadMini4,
"iPad6,3": .iPadPro9_7,
"iPad6,11": .iPadPro9_7,
"iPad6,4": .iPadPro9_7_cell,
"iPad6,12": .iPadPro9_7_cell,
"iPad6,7": .iPadPro12_9,
"iPad6,8": .iPadPro12_9_cell,
"iPad7,3": .iPadPro10_5,
"iPad7,4": .iPadPro10_5_cell,
"iPhone7,1": .iPhone6plus,
"iPhone7,2": .iPhone6,
"iPhone8,1": .iPhone6S,
"iPhone8,2": .iPhone6Splus,
"iPhone8,4": .iPhoneSE,
"iPhone9,1": .iPhone7,
"iPhone9,2": .iPhone7plus,
"iPhone9,3": .iPhone7,
"iPhone9,4": .iPhone7plus,
"iPhone10,1": .iPhone8,
"iPhone10,2": .iPhone8plus,
"iPhone10,3": .iPhoneX
]
if let model = modelMap[String.init(validatingUTF8: modelCode!)!] {
return model
}
return Model.unrecognized
}
public var isIPad: Bool {
if let modelCode = modelCode {
return modelCode.contains("iPad")
}
return false
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment