UIDevice currentDevice模型可能的值

什么是[[UIDevice currentDevice] model];返回的所有可能的值[[UIDevice currentDevice] model]; ? 没有logging 。

可能的价格是iPod touchiPhoneiPhone SimulatoriPadiPad Simulator

如果你想知道哪个硬件iOS破坏就像iPhone3iPhone4iPhone5等是下面的代码


注意:下面的代码可能不包含所有设备的string,我与其他人在GitHub上保持相同的代码,所以请从那里采取最新的代码

Objective-C: GitHub / DeviceUtil

Swift: GitHub / DeviceGuru


 #include <sys/types.h> #include <sys/sysctl.h> - (NSString*)hardwareDescription { NSString *hardware = [self hardwareString]; if ([hardware isEqualToString:@"iPhone1,1"]) return @"iPhone 2G"; if ([hardware isEqualToString:@"iPhone1,2"]) return @"iPhone 3G"; if ([hardware isEqualToString:@"iPhone3,1"]) return @"iPhone 4"; if ([hardware isEqualToString:@"iPhone4,1"]) return @"iPhone 4S"; if ([hardware isEqualToString:@"iPhone5,1"]) return @"iPhone 5"; if ([hardware isEqualToString:@"iPod1,1"]) return @"iPodTouch 1G"; if ([hardware isEqualToString:@"iPod2,1"]) return @"iPodTouch 2G"; if ([hardware isEqualToString:@"iPad1,1"]) return @"iPad"; if ([hardware isEqualToString:@"iPad2,6"]) return @"iPad Mini"; if ([hardware isEqualToString:@"iPad4,1"]) return @"iPad Air WIFI"; //there are lots of other strings too, checkout the github repo //link is given at the top of this answer if ([hardware isEqualToString:@"i386"]) return @"Simulator"; if ([hardware isEqualToString:@"x86_64"]) return @"Simulator"; return nil; } - (NSString*)hardwareString { size_t size = 100; char *hw_machine = malloc(size); int name[] = {CTL_HW,HW_MACHINE}; sysctl(name, 2, hw_machine, &size, NULL, 0); NSString *hardware = [NSString stringWithUTF8String:hw_machine]; free(hw_machine); return hardware; } 

我只是在iPod Touch,iPhone,手机视网膜,iPhone 5,iPad,iPad Retina和iPad Mini上做了testing。 所以这是我的结论:

 iPod touch iPhone iPad 

在模拟器上 – 如果你是一个开发人员,他们有时在模拟器上根本无法工作,那么这将会非常有用 – 你会得到这些值:

 iPhone Simulator iPad Simulator 

我相信解释的最好答案(这里没有写的东西)就是说这个值本身就是一个string值。 可能的答案是string,例如:“iPhone”,“iPad”等。

这些答案都不能用于新的型号。 这是一个枚举:

 public enum DeviceType { case iPad(String?) case iPhone(String?) case simulator(String?) case appleTV(String?) case unknown } 

扩展我写道,当新的型号出现时,我认为它是一个更清洁,更可扩展的扩展。

 extension UIDevice { public static func getDevice() -> DeviceType { var info = utsname() uname(&info) let machineMirror = Mirror(reflecting: info.machine) let code = machineMirror.children.reduce("") { identifier, element in guard let value = element.value as? Int8, value != 0 else { return identifier } return identifier + String(UnicodeScalar(UInt8(value))) } if code.lowercased().range(of: "ipad") != nil { if let range = code.lowercased().range(of: "ipad") { var mutate = code mutate.removeSubrange(range) return .iPad(mutate) }else{ return .iPad(nil) } }else if code.lowercased().range(of: "iphone") != nil { if let range = code.lowercased().range(of: "iphone") { var mutate = code mutate.removeSubrange(range) return .iPhone(mutate) }else{ return .iPhone(nil) } }else if code.lowercased().range(of: "i386") != nil || code.lowercased().range(of: "x86_64") != nil{ return .simulator(code) }else if code.lowercased().range(of: "appletv") != nil { if let range = code.lowercased().range(of: "appletv") { var mutate = code mutate.removeSubrange(range) return .appleTV(mutate) }else{ return .appleTV(nil) } }else{ return .unknown } } }