Created
August 13, 2018 20:23
-
-
Save andrewcar/20464a98f106d39e84692a5d980c521d to your computer and use it in GitHub Desktop.
Easy way to get current device type with dot notation
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
import UIKit | |
public enum DeviceType { | |
case iPhone4 | |
case iPhone4s | |
case iPhone5 | |
case iPhone5c | |
case iPhone5s | |
case iPhone6 | |
case iPhone6Plus | |
case iPhone6s | |
case iPhone6sPlus | |
case iPhone7 | |
case iPhone7Plus | |
case iPhoneSE | |
case iPhone8 | |
case iPhone8Plus | |
case iPhoneX | |
case iPodTouch5 | |
case iPodTouch6 | |
case iPad2 | |
case iPad3 | |
case iPad4 | |
case iPadAir | |
case iPadAir2 | |
case iPad5 | |
case iPad6 | |
case iPadMini | |
case iPadMini2 | |
case iPadMini3 | |
case iPadMini4 | |
case iPadPro9p7Inch | |
case iPadPro10p5Inch | |
case iPadPro12p9Inch | |
case iPadPro12p9Inch2ndGen | |
case AppleTV | |
case AppleTV4K | |
case HomePod | |
case SimulatoriPhone5s | |
case SimulatoriPhone6 | |
case SimulatoriPhone6Plus | |
case SimulatoriPhone6s | |
case SimulatoriPhone6sPlus | |
case SimulatoriPhone7 | |
case SimulatoriPhone7Plus | |
case SimulatoriPhone8 | |
case SimulatoriPhone8Plus | |
case SimulatoriPhoneSE | |
case SimulatoriPhoneX | |
case SimulatoriPad5 | |
case SimulatoriPadAir | |
case SimulatoriPadAir2 | |
case SimulatoriPadPro9p7Inch | |
case SimulatoriPadPro10p5Inch | |
case SimulatoriPadPro12p9Inch | |
case SimulatoriPadPro12p9Inch2ndGen | |
case NotAvailable | |
} | |
public extension UIDevice { | |
static let modelName: DeviceType = { | |
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))) | |
} | |
func mapToDevice(identifier: String) -> DeviceType { | |
switch identifier { | |
case "iPod5,1": return .iPodTouch5 | |
case "iPod7,1": return .iPodTouch6 | |
case "iPhone3,1", "iPhone3,2", "iPhone3,3": return .iPhone4 | |
case "iPhone4,1": return .iPhone4s | |
case "iPhone5,1", "iPhone5,2": return .iPhone5 | |
case "iPhone5,3", "iPhone5,4": return .iPhone5c | |
case "iPhone6,1", "iPhone6,2": return .iPhone5s | |
case "iPhone7,2": return .iPhone6 | |
case "iPhone7,1": return .iPhone6Plus | |
case "iPhone8,1": return .iPhone6s | |
case "iPhone8,2": return .iPhone6sPlus | |
case "iPhone9,1", "iPhone9,3": return .iPhone7 | |
case "iPhone9,2", "iPhone9,4": return .iPhone7Plus | |
case "iPhone8,4": return .iPhoneSE | |
case "iPhone10,1", "iPhone10,4": return .iPhone8 | |
case "iPhone10,2", "iPhone10,5": return .iPhone8Plus | |
case "iPhone10,3", "iPhone10,6": return .iPhoneX | |
case "iPad2,1", "iPad2,2", "iPad2,3", "iPad2,4":return .iPad2 | |
case "iPad3,1", "iPad3,2", "iPad3,3": return .iPad3 | |
case "iPad3,4", "iPad3,5", "iPad3,6": return .iPad4 | |
case "iPad4,1", "iPad4,2", "iPad4,3": return .iPadAir | |
case "iPad5,3", "iPad5,4": return .iPadAir2 | |
case "iPad6,11", "iPad6,12": return .iPad5 | |
case "iPad7,5", "iPad7,6": return .iPad6 | |
case "iPad2,5", "iPad2,6", "iPad2,7": return .iPadMini | |
case "iPad4,4", "iPad4,5", "iPad4,6": return .iPadMini2 | |
case "iPad4,7", "iPad4,8", "iPad4,9": return .iPadMini3 | |
case "iPad5,1", "iPad5,2": return .iPadMini4 | |
case "iPad6,3", "iPad6,4": return .iPadPro9p7Inch | |
case "iPad6,7", "iPad6,8": return .iPadPro12p9Inch | |
case "iPad7,1", "iPad7,2": return .iPadPro12p9Inch2ndGen | |
case "iPad7,3", "iPad7,4": return .iPadPro10p5Inch | |
case "AppleTV5,3": return .AppleTV | |
case "AppleTV6,2": return .AppleTV4K | |
case "AudioAccessory1,1": return .HomePod | |
case "i386", "x86_64": | |
guard let environment = ProcessInfo().environment["SIMULATOR_MODEL_IDENTIFIER"] else { return .NotAvailable } | |
switch mapToDevice(identifier: environment) { | |
case .iPhone5s: return .SimulatoriPhone5s | |
case .iPhone6: return .SimulatoriPhone6 | |
case .iPhone6Plus: return .SimulatoriPhone6Plus | |
case .iPhone6s: return .SimulatoriPhone6s | |
case .iPhone6sPlus: return .SimulatoriPhone6sPlus | |
case .iPhone7: return .SimulatoriPhone7 | |
case .iPhone7Plus: return .SimulatoriPhone7Plus | |
case .iPhone8: return .SimulatoriPhone8 | |
case .iPhone8Plus: return .SimulatoriPhone8Plus | |
case .iPhoneSE: return .SimulatoriPhoneSE | |
case .iPhoneX: return .SimulatoriPhoneX | |
case .iPad5: return .SimulatoriPad5 | |
case .iPadAir: return .SimulatoriPadAir | |
case .iPadAir2: return .SimulatoriPadAir2 | |
case .iPadPro9p7Inch: return .SimulatoriPadPro9p7Inch | |
case .iPadPro10p5Inch: return .SimulatoriPadPro10p5Inch | |
case .iPadPro12p9Inch: return .SimulatoriPadPro12p9Inch | |
case .iPadPro12p9Inch2ndGen: return .SimulatoriPadPro12p9Inch2ndGen | |
default: return .NotAvailable | |
} | |
default: return .NotAvailable | |
} | |
} | |
return mapToDevice(identifier: identifier) | |
}() | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment