如何在iOS上获取设备制造和模型?
我想知道是否有可能确定什么样的iPhone(例如)当前设备是? 我知道有可能通过模型
NSString *deviceType = [[UIDevice currentDevice] model];
这将只是返回,无论我有一个“iPhone”或“iPod”,但我想知道是否有可能检测/知道我是否有iPhone 3GS与iPhone 4S与iPhone 4S (实际上,所有我真的想要做的是确定我是否有3G,因为我正在做相当图形密集的东西) 。
所以,是的,让我知道,谢谢!
试试这个库: http : //github.com/erica/uidevice-extension/ (由埃里卡Sadun)。
(示例代码):
[[UIDevice currentDevice] platformType] // ex: UIDevice4GiPhone [[UIDevice currentDevice] platformString] // ex: @"iPhone 4G"
或者你可以使用这个方法:
您可以从sys / utsname.h中使用uname获取设备型号。 例如:
Objective-C的
#import <sys/utsname.h> // import it in your header or implementation file. NSString* deviceName() { struct utsname systemInfo; uname(&systemInfo); return [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding]; }
Swift 3
extension UIDevice { var modelName: 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 } } print(UIDevice.current.modelName)
结果应该是:
//Simultor @"i386" on 32-bit Simulator @"x86_64" on 64-bit Simulator //iPhone @"iPhone1,1" on iPhone @"iPhone1,2" on iPhone 3G @"iPhone2,1" on iPhone 3GS @"iPhone3,1" on iPhone 4 (GSM) @"iPhone3,3" on iPhone 4 (CDMA/Verizon/Sprint) @"iPhone4,1" on iPhone 4S @"iPhone5,1" on iPhone 5 (model A1428, AT&T/Canada) @"iPhone5,2" on iPhone 5 (model A1429, everything else) @"iPhone5,3" on iPhone 5c (model A1456, A1532 | GSM) @"iPhone5,4" on iPhone 5c (model A1507, A1516, A1526 (China), A1529 | Global) @"iPhone6,1" on iPhone 5s (model A1433, A1533 | GSM) @"iPhone6,2" on iPhone 5s (model A1457, A1518, A1528 (China), A1530 | Global) @"iPhone7,1" on iPhone 6 Plus @"iPhone7,2" on iPhone 6 @"iPhone8,1" on iPhone 6S @"iPhone8,2" on iPhone 6S Plus @"iPhone8,4" on iPhone SE @"iPhone9,1" on iPhone 7 (CDMA) @"iPhone9,3" on iPhone 7 (GSM) @"iPhone9,2" on iPhone 7 Plus (CDMA) @"iPhone9,4" on iPhone 7 Plus (GSM) @"iPhone10,1" on iPhone 8 (CDMA) @"iPhone10,4" on iPhone 8 (GSM) @"iPhone10,2" on iPhone 8 Plus (CDMA) @"iPhone10,5" on iPhone 8 Plus (GSM) @"iPhone10,3" on iPhone X (CDMA) @"iPhone10,6" on iPhone X (GSM) //iPad 1 @"iPad1,1" on iPad - Wifi (model A1219) @"iPad1,1" on iPad - Wifi + Cellular (model A1337) //iPad 2 @"iPad2,1" - Wifi (model A1395) @"iPad2,2" - GSM (model A1396) @"iPad2,3" - 3G (model A1397) @"iPad2,4" - Wifi (model A1395) // iPad Mini @"iPad2,5" - Wifi (model A1432) @"iPad2,6" - Wifi + Cellular (model A1454) @"iPad2,7" - Wifi + Cellular (model A1455) //iPad 3 @"iPad3,1" - Wifi (model A1416) @"iPad3,2" - Wifi + Cellular (model A1403) @"iPad3,3" - Wifi + Cellular (model A1430) //iPad 4 @"iPad3,4" - Wifi (model A1458) @"iPad3,5" - Wifi + Cellular (model A1459) @"iPad3,6" - Wifi + Cellular (model A1460) //iPad AIR @"iPad4,1" - Wifi (model A1474) @"iPad4,2" - Wifi + Cellular (model A1475) @"iPad4,3" - Wifi + Cellular (model A1476) // iPad Mini 2 @"iPad4,4" - Wifi (model A1489) @"iPad4,5" - Wifi + Cellular (model A1490) @"iPad4,6" - Wifi + Cellular (model A1491) // iPad Mini 3 @"iPad4,7" - Wifi (model A1599) @"iPad4,8" - Wifi + Cellular (model A1600) @"iPad4,9" - Wifi + Cellular (model A1601) // iPad Mini 4 @"iPad5,1" - Wifi (model A1538) @"iPad5,2" - Wifi + Cellular (model A1550) //iPad AIR 2 @"iPad5,3" - Wifi (model A1566) @"iPad5,4" - Wifi + Cellular (model A1567) // iPad PRO 12.9" @"iPad6,3" - Wifi (model A1673) @"iPad6,4" - Wifi + Cellular (model A1674) @"iPad6,4" - Wifi + Cellular (model A1675) //iPad PRO 9.7" @"iPad6,7" - Wifi (model A1584) @"iPad6,8" - Wifi + Cellular (model A1652) //iPad (5th generation) @"iPad6,11" - Wifi (model A1822) @"iPad6,12" - Wifi + Cellular (model A1823) //iPad PRO 12.9" (2nd Gen) @"iPad7,1" - Wifi (model A1670) @"iPad7,2" - Wifi + Cellular (model A1671) @"iPad7,2" - Wifi + Cellular (model A1821) //iPad PRO 10.5" @"iPad7,3" - Wifi (model A1701) @"iPad7,4" - Wifi + Cellular (model A1709) //iPod Touch @"iPod1,1" on iPod Touch @"iPod2,1" on iPod Touch Second Generation @"iPod3,1" on iPod Touch Third Generation @"iPod4,1" on iPod Touch Fourth Generation @"iPod7,1" on iPod Touch 6th Generation
为了扩大OhhMee的回答,我添加了一些故障保护来支持未列入清单的未来设备:
#import <sys/utsname.h> #import "MyClass.h" @implementation MyClass { //(your private ivars) } - (NSString*) deviceName { struct utsname systemInfo; uname(&systemInfo); NSString* code = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding]; static NSDictionary* deviceNamesByCode = nil; if (!deviceNamesByCode) { deviceNamesByCode = @{@"i386" : @"Simulator", @"x86_64" : @"Simulator", @"iPod1,1" : @"iPod Touch", // (Original) @"iPod2,1" : @"iPod Touch", // (Second Generation) @"iPod3,1" : @"iPod Touch", // (Third Generation) @"iPod4,1" : @"iPod Touch", // (Fourth Generation) @"iPod7,1" : @"iPod Touch", // (6th Generation) @"iPhone1,1" : @"iPhone", // (Original) @"iPhone1,2" : @"iPhone", // (3G) @"iPhone2,1" : @"iPhone", // (3GS) @"iPad1,1" : @"iPad", // (Original) @"iPad2,1" : @"iPad 2", // @"iPad3,1" : @"iPad", // (3rd Generation) @"iPhone3,1" : @"iPhone 4", // (GSM) @"iPhone3,3" : @"iPhone 4", // (CDMA/Verizon/Sprint) @"iPhone4,1" : @"iPhone 4S", // @"iPhone5,1" : @"iPhone 5", // (model A1428, AT&T/Canada) @"iPhone5,2" : @"iPhone 5", // (model A1429, everything else) @"iPad3,4" : @"iPad", // (4th Generation) @"iPad2,5" : @"iPad Mini", // (Original) @"iPhone5,3" : @"iPhone 5c", // (model A1456, A1532 | GSM) @"iPhone5,4" : @"iPhone 5c", // (model A1507, A1516, A1526 (China), A1529 | Global) @"iPhone6,1" : @"iPhone 5s", // (model A1433, A1533 | GSM) @"iPhone6,2" : @"iPhone 5s", // (model A1457, A1518, A1528 (China), A1530 | Global) @"iPhone7,1" : @"iPhone 6 Plus", // @"iPhone7,2" : @"iPhone 6", // @"iPhone8,1" : @"iPhone 6S", // @"iPhone8,2" : @"iPhone 6S Plus", // @"iPhone8,4" : @"iPhone SE", // @"iPhone9,1" : @"iPhone 7", // @"iPhone9,3" : @"iPhone 7", // @"iPhone9,2" : @"iPhone 7 Plus", // @"iPhone9,4" : @"iPhone 7 Plus", // @"iPhone10,1": @"iPhone 8", // CDMA @"iPhone10,4": @"iPhone 8", // GSM @"iPhone10,2": @"iPhone 8 Plus", // CDMA @"iPhone10,5": @"iPhone 8 Plus", // GSM @"iPhone10,3": @"iPhone X", // CDMA @"iPhone10,6": @"iPhone X", // GSM @"iPad4,1" : @"iPad Air", // 5th Generation iPad (iPad Air) - Wifi @"iPad4,2" : @"iPad Air", // 5th Generation iPad (iPad Air) - Cellular @"iPad4,4" : @"iPad Mini", // (2nd Generation iPad Mini - Wifi) @"iPad4,5" : @"iPad Mini", // (2nd Generation iPad Mini - Cellular) @"iPad4,7" : @"iPad Mini", // (3rd Generation iPad Mini - Wifi (model A1599)) @"iPad6,7" : @"iPad Pro (12.9\")", // iPad Pro 12.9 inches - (model A1584) @"iPad6,8" : @"iPad Pro (12.9\")", // iPad Pro 12.9 inches - (model A1652) @"iPad6,3" : @"iPad Pro (9.7\")", // iPad Pro 9.7 inches - (model A1673) @"iPad6,4" : @"iPad Pro (9.7\")" // iPad Pro 9.7 inches - (models A1674 and A1675) }; } NSString* deviceName = [deviceNamesByCode objectForKey:code]; if (!deviceName) { // Not found on database. At least guess main device type from string contents: if ([code rangeOfString:@"iPod"].location != NSNotFound) { deviceName = @"iPod Touch"; } else if([code rangeOfString:@"iPad"].location != NSNotFound) { deviceName = @"iPad"; } else if([code rangeOfString:@"iPhone"].location != NSNotFound){ deviceName = @"iPhone"; } else { deviceName = @"Unknown"; } } return deviceName; } // (rest of class implementation omitted) @end
我也省略了详细的信息(例如“型号A1507,A1516,A1526(中国),A1529 |全球”),并将其放置在注释中,以防将其用作面向用户的字符串,而不会将其吓跑。
编辑: 这个答案提供了一个类似的实现使用Swift 2。
编辑2:我刚刚添加了iPad Pro模型(两种尺寸)。 为了将来的参考,型号/等。 可以在iPhone Wiki中找到。
我已经制作了这个plist文件来帮助你获得每个设备的完整名称(源代码在我的答案的最后)
根据OhhMee的回答 ,你可以像这样使用它:
#import <sys/utsname.h> NSString *machineName() { struct utsname systemInfo; uname(&systemInfo); NSString *iOSDeviceModelsPath = [[NSBundle mainBundle] pathForResource:@"iOSDeviceModelMapping" ofType:@"plist"]; NSDictionary *iOSDevices = [NSDictionary dictionaryWithContentsOfFile:iOSDeviceModelsPath]; NSString* deviceModel = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding]; return [iOSDevices valueForKey:deviceModel]; }
这是plist:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>x86_64</key> <string>Simulator</string> <key>i386</key> <string>Simulator</string> <key>iPod1,1</key> <string>iPod Touch 1st Gen</string> <key>iPod2,1</key> <string>iPod Touch 2nd Gen</string> <key>iPod3,1</key> <string>iPod Touch 3rd Gen</string> <key>iPod4,1</key> <string>iPod Touch 4th Gen</string> <key>iPod5,1</key> <string>iPod Touch 5th Gen</string> <key>iPod7,1</key> <string>iPod Touch 6th Gen</string> <key>iPhone1,1</key> <string>iPhone</string> <key>iPhone1,2</key> <string>iPhone 3G</string> <key>iPhone2,1</key> <string>iPhone 3GS</string> <key>iPhone3,1</key> <string>iPhone 4</string> <key>iPhone3,2</key> <string>iPhone 4</string> <key>iPhone3,3</key> <string>iPhone 4</string> <key>iPhone4,1</key> <string>iPhone 4S</string> <key>iPhone5,1</key> <string>iPhone 5 model A1428</string> <key>iPhone5,2</key> <string>iPhone 5 model A1429</string> <key>iPhone5,3</key> <string>iPhone 5C</string> <key>iPhone5,4</key> <string>iPhone 5C</string> <key>iPhone6,1</key> <string>iPhone 5S</string> <key>iPhone6,2</key> <string>iPhone 5S</string> <key>iPhone7,2</key> <string>iPhone 6</string> <key>iPhone7,1</key> <string>iPhone 6 Plus</string> <key>iPhone8,1</key> <string>iPhone 6S</string> <key>iPhone8,2</key> <string>iPhone 6S Plus</string> <key>iPhone8,4</key> <string>iPhone SE</string> <key>iPhone9,1</key> <string>iPhone 7</string> <key>iPhone9,2</key> <string>iPhone 7 Plus</string> <key>iPhone9,3</key> <string>iPhone 7</string> <key>iPhone9,4</key> <string>iPhone 7 Plus</string> <key>iPhone10,1</key> <string>iPhone 8</string> <key>iPhone10,4</key> <string>iPhone 8</string> <key>iPhone10,2</key> <string>iPhone 8 Plus</string> <key>iPhone10,5</key> <string>iPhone 8 Plus</string> <key>iPhone10,3</key> <string>iPhone X</string> <key>iPhone10,6</key> <string>iPhone X</string> <key>iPad1,1</key> <string>iPad</string> <key>iPad2,1</key> <string>iPad 2</string> <key>iPad2,2</key> <string>iPad 2</string> <key>iPad2,3</key> <string>iPad 2</string> <key>iPad2,4</key> <string>iPad 2</string> <key>iPad3,1</key> <string>iPad 3rd Gen</string> <key>iPad3,2</key> <string>iPad 3rd Gen</string> <key>iPad3,3</key> <string>iPad 3rd Gen</string> <key>iPad3,4</key> <string>iPad 4th Gen</string> <key>iPad3,5</key> <string>iPad 4th Gen</string> <key>iPad3,6</key> <string>iPad 4th Gen</string> <key>iPad4,1</key> <string>iPad Air</string> <key>iPad4,2</key> <string>iPad Air</string> <key>iPad4,3</key> <string>iPad Air</string> <key>iPad2,5</key> <string>iPad Mini 1st Gen</string> <key>iPad2,6</key> <string>iPad Mini 1st Gen</string> <key>iPad2,7</key> <string>iPad Mini 1st Gen</string> <key>iPad4,4</key> <string>iPad Mini 2nd Gen</string> <key>iPad4,5</key> <string>iPad Mini 2nd Gen</string> <key>iPad4,6</key> <string>iPad Mini 2nd Gen</string> <key>iPad4,7</key> <string>iPad Mini 3rd Gen</string> <key>iPad4,8</key> <string>iPad Mini 3rd Gen</string> <key>iPad4,9</key> <string>iPad Mini 3rd Gen</string> <key>iPad5,1</key> <string>iPad Mini 4</string> <key>iPad5,2</key> <string>iPad Mini 4</string> <key>iPad5,3</key> <string>iPad Air 2</string> <key>iPad5,4</key> <string>iPad Air 2</string> <key>iPad6,3</key> <string>iPad Pro 9.7 inch</string> <key>iPad6,4</key> <string>iPad Pro 9.7 inch</string> <key>iPad6,7</key> <string>iPad Pro 12.9 inch</string> <key>iPad6,8</key> <string>iPad Pro 12.9 inch</string> <key>iPad7,1</key> <string>iPad Pro 12.9 inch 2nd Gen</string> <key>iPad7,2</key> <string>iPad Pro 12.9 inch 2nd Gen</string> <key>iPad7,3</key> <string>iPad Pro 10.5 inch</string> <key>iPad7,4</key> <string>iPad Pro 10.5 inch</string> </dict> </plist>
[[UIDevice currentDevice] model]
只是返回iPhone
或iPod
,你没有得到模型的数字,让你区分不同代的设备。
代码这个方法:
#include <sys/sysctl.h> ... + (NSString *)getModel { size_t size; sysctlbyname("hw.machine", NULL, &size, NULL, 0); char *model = malloc(size); sysctlbyname("hw.machine", model, &size, NULL, 0); NSString *deviceModel = [NSString stringWithCString:model encoding:NSUTF8StringEncoding]; free(model); return deviceModel; }
当你需要这个模型的时候,调用方法[self getModel]
你就可以得到ie:“iPhone5,1”,这个可笑而又快速的iPhone 5。
一个好的做法是创建一个名为Utils.h/Utils.m
的类,并在其中放置诸如getModel
方法,这样您就可以通过导入类并调用[Utils getModel];
从应用程序中的任何位置获取此信息[Utils getModel];
下面是代码( 代码可能不包含所有设备的字符串,我与其他人在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; }
我已经优化了NicolasMiari的实现,并添加了Simulator
,在这里:
+ (NSString*)deviceName { static NSDictionary* deviceNamesByCode = nil; static NSString* deviceName = nil; if (deviceName) { return deviceName; } deviceNamesByCode = @{ @"i386" :@"Simulator", @"iPod1,1" :@"iPod Touch", // (Original) @"iPod2,1" :@"iPod Touch", // (Second Generation) @"iPod3,1" :@"iPod Touch", // (Third Generation) @"iPod4,1" :@"iPod Touch", // (Fourth Generation) @"iPhone1,1" :@"iPhone", // (Original) @"iPhone1,2" :@"iPhone", // (3G) @"iPhone2,1" :@"iPhone", // (3GS) @"iPad1,1" :@"iPad", // (Original) @"iPad2,1" :@"iPad 2", // @"iPad3,1" :@"iPad", // (3rd Generation) @"iPhone3,1" :@"iPhone 4", // @"iPhone4,1" :@"iPhone 4S", // @"iPhone5,1" :@"iPhone 5", // (model A1428, AT&T/Canada) @"iPhone5,2" :@"iPhone 5", // (model A1429, everything else) @"iPad3,4" :@"iPad", // (4th Generation) @"iPad2,5" :@"iPad Mini", // (Original) @"iPhone5,3" :@"iPhone 5c", // (model A1456, A1532 | GSM) @"iPhone5,4" :@"iPhone 5c", // (model A1507, A1516, A1526 (China), A1529 | Global) @"iPhone6,1" :@"iPhone 5s", // (model A1433, A1533 | GSM) @"iPhone6,2" :@"iPhone 5s", // (model A1457, A1518, A1528 (China), A1530 | Global) @"iPad4,1" :@"iPad Air", // 5th Generation iPad (iPad Air) - Wifi @"iPad4,2" :@"iPad Air", // 5th Generation iPad (iPad Air) - Cellular @"iPad4,4" :@"iPad Mini", // (2nd Generation iPad Mini - Wifi) @"iPad4,5" :@"iPad Mini" // (2nd Generation iPad Mini - Cellular) }; struct utsname systemInfo; uname(&systemInfo); NSString* code = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding]; deviceName = [deviceNamesByCode objectForKey:code]; if (!deviceName) { // Not found in database. At least guess main device type from string contents: if ([code rangeOfString:@"iPod"].location != NSNotFound) { deviceName = @"iPod Touch"; } else if([code rangeOfString:@"iPad"].location != NSNotFound) { deviceName = @"iPad"; } else if([code rangeOfString:@"iPhone"].location != NSNotFound){ deviceName = @"iPhone"; } else { deviceName = @"Simulator"; } } return deviceName; }
“`
一个远离NSString描述的类别
一般来说,希望避免在整个代码中进行任意的字符串比较。 最好在一个地方更新字符串,并从应用程序中隐藏魔术字符串。 我为此提供了一个有关UIDevice
的类别。
对于我的具体需求,我需要知道我使用的是哪种设备,而不需要知道可以通过其他方式轻松检索的关于网络功能的细节。 所以你会发现比日益增长的设备列表更粗糙的粒度enum
。
更新是将设备添加到枚举和查找表的问题。
的UIDevice + NTNUExtensions.h
typedef NS_ENUM(NSUInteger, NTNUDeviceType) { DeviceAppleUnknown, DeviceAppleSimulator, DeviceAppleiPhone, DeviceAppleiPhone3G, DeviceAppleiPhone3GS, DeviceAppleiPhone4, DeviceAppleiPhone4S, DeviceAppleiPhone5, DeviceAppleiPhone5C, DeviceAppleiPhone5S, DeviceAppleiPhone6, DeviceAppleiPhone6_Plus, DeviceAppleiPhone6S, DeviceAppleiPhone6S_Plus, DeviceAppleiPhoneSE, DeviceAppleiPhone7, DeviceAppleiPhone7_Plus, DeviceAppleiPodTouch, DeviceAppleiPodTouch2G, DeviceAppleiPodTouch3G, DeviceAppleiPodTouch4G, DeviceAppleiPad, DeviceAppleiPad2, DeviceAppleiPad3G, DeviceAppleiPad4G, DeviceAppleiPad5G_Air, DeviceAppleiPadMini, DeviceAppleiPadMini2G, DeviceAppleiPadPro12, DeviceAppleiPadPro9 }; @interface UIDevice (NTNUExtensions) - (NSString *)ntnu_deviceDescription; - (NTNUDeviceType)ntnu_deviceType; @end
的UIDevice + NTNUExtensions.m
#import <sys/utsname.h> #import "UIDevice+NTNUExtensions.h" @implementation UIDevice (NTNUExtensions) - (NSString *)ntnu_deviceDescription { struct utsname systemInfo; uname(&systemInfo); return [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding]; } - (NTNUDeviceType)ntnu_deviceType { NSNumber *deviceType = [[self ntnu_deviceTypeLookupTable] objectForKey:[self ntnu_deviceDescription]]; return [deviceType unsignedIntegerValue]; } - (NSDictionary *)ntnu_deviceTypeLookupTable { return @{ @"i386": @(DeviceAppleSimulator), @"x86_64": @(DeviceAppleSimulator), @"iPod1,1": @(DeviceAppleiPodTouch), @"iPod2,1": @(DeviceAppleiPodTouch2G), @"iPod3,1": @(DeviceAppleiPodTouch3G), @"iPod4,1": @(DeviceAppleiPodTouch4G), @"iPhone1,1": @(DeviceAppleiPhone), @"iPhone1,2": @(DeviceAppleiPhone3G), @"iPhone2,1": @(DeviceAppleiPhone3GS), @"iPhone3,1": @(DeviceAppleiPhone4), @"iPhone3,3": @(DeviceAppleiPhone4), @"iPhone4,1": @(DeviceAppleiPhone4S), @"iPhone5,1": @(DeviceAppleiPhone5), @"iPhone5,2": @(DeviceAppleiPhone5), @"iPhone5,3": @(DeviceAppleiPhone5C), @"iPhone5,4": @(DeviceAppleiPhone5C), @"iPhone6,1": @(DeviceAppleiPhone5S), @"iPhone6,2": @(DeviceAppleiPhone5S), @"iPhone7,1": @(DeviceAppleiPhone6_Plus), @"iPhone7,2": @(DeviceAppleiPhone6), @"iPhone8,1" :@(DeviceAppleiPhone6S), @"iPhone8,2" :@(DeviceAppleiPhone6S_Plus), @"iPhone8,4" :@(DeviceAppleiPhoneSE), @"iPhone9,1" :@(DeviceAppleiPhone7), @"iPhone9,3" :@(DeviceAppleiPhone7), @"iPhone9,2" :@(DeviceAppleiPhone7_Plus), @"iPhone9,4" :@(DeviceAppleiPhone7_Plus), @"iPad1,1": @(DeviceAppleiPad), @"iPad2,1": @(DeviceAppleiPad2), @"iPad3,1": @(DeviceAppleiPad3G), @"iPad3,4": @(DeviceAppleiPad4G), @"iPad2,5": @(DeviceAppleiPadMini), @"iPad4,1": @(DeviceAppleiPad5G_Air), @"iPad4,2": @(DeviceAppleiPad5G_Air), @"iPad4,4": @(DeviceAppleiPadMini2G), @"iPad4,5": @(DeviceAppleiPadMini2G), @"iPad4,7":@(DeviceAppleiPadMini), @"iPad6,7":@(DeviceAppleiPadPro12), @"iPad6,8":@(DeviceAppleiPadPro12), @"iPad6,3":@(DeviceAppleiPadPro9), @"iPad6,4":@(DeviceAppleiPadPro9) }; } @end
设备名称和机器名称,基于iOS真实设备硬件
我对这个问题的解决方案基本上看起来与@NicolasMiari在这个线程中的答案。 独立的实用程序类具有一组预定义的设备和机器名称,然后根据真实的机器名称检索设备名称。
注:这个答案和它的链接GitHub项目已经更新,以确定截至2017年10月当前最新的iPhone(iPhone 8,8 + X) 。这也适用于iOS11 。 请访问GitHub仓库并查看,如果出现问题,请给我反馈。
/* * Retrieves back the device name or if not the machine name. */ + (NSString*)deviceModelName { struct utsname systemInfo; uname(&systemInfo); NSString *machineName = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding]; //MARK: More official list is at //http://theiphonewiki.com/wiki/Models //MARK: You may just return machineName. Following is for convenience NSDictionary *commonNamesDictionary = @{ @"i386": @"i386 Simulator", @"x86_64": @"x86_64 Simulator", @"iPhone1,1": @"iPhone", @"iPhone1,2": @"iPhone 3G", @"iPhone2,1": @"iPhone 3GS", @"iPhone3,1": @"iPhone 4", @"iPhone3,2": @"iPhone 4(Rev A)", @"iPhone3,3": @"iPhone 4(CDMA)", @"iPhone4,1": @"iPhone 4S", @"iPhone5,1": @"iPhone 5(GSM)", @"iPhone5,2": @"iPhone 5(GSM+CDMA)", @"iPhone5,3": @"iPhone 5c(GSM)", @"iPhone5,4": @"iPhone 5c(GSM+CDMA)", @"iPhone6,1": @"iPhone 5s(GSM)", @"iPhone6,2": @"iPhone 5s(GSM+CDMA)", @"iPhone7,1": @"iPhone 6+(GSM+CDMA)", @"iPhone7,2": @"iPhone 6(GSM+CDMA)", @"iPhone8,1": @"iPhone 6S(GSM+CDMA)", @"iPhone8,2": @"iPhone 6S+(GSM+CDMA)", @"iPhone8,4": @"iPhone SE(GSM+CDMA)", @"iPhone9,1": @"iPhone 7(GSM+CDMA)", @"iPhone9,2": @"iPhone 7+(GSM+CDMA)", @"iPhone9,3": @"iPhone 7(GSM+CDMA)", @"iPhone9,4": @"iPhone 7+(GSM+CDMA)", @"iPad1,1": @"iPad", @"iPad2,1": @"iPad 2(WiFi)", @"iPad2,2": @"iPad 2(GSM)", @"iPad2,3": @"iPad 2(CDMA)", @"iPad2,4": @"iPad 2(WiFi Rev A)", @"iPad2,5": @"iPad Mini 1G (WiFi)", @"iPad2,6": @"iPad Mini 1G (GSM)", @"iPad2,7": @"iPad Mini 1G (GSM+CDMA)", @"iPad3,1": @"iPad 3(WiFi)", @"iPad3,2": @"iPad 3(GSM+CDMA)", @"iPad3,3": @"iPad 3(GSM)", @"iPad3,4": @"iPad 4(WiFi)", @"iPad3,5": @"iPad 4(GSM)", @"iPad3,6": @"iPad 4(GSM+CDMA)", @"iPad4,1": @"iPad Air(WiFi)", @"iPad4,2": @"iPad Air(GSM)", @"iPad4,3": @"iPad Air(GSM+CDMA)", @"iPad5,3": @"iPad Air 2 (WiFi)", @"iPad5,4": @"iPad Air 2 (GSM+CDMA)", @"iPad4,4": @"iPad Mini 2G (WiFi)", @"iPad4,5": @"iPad Mini 2G (GSM)", @"iPad4,6": @"iPad Mini 2G (GSM+CDMA)", @"iPad4,7": @"iPad Mini 3G (WiFi)", @"iPad4,8": @"iPad Mini 3G (GSM)", @"iPad4,9": @"iPad Mini 3G (GSM+CDMA)", @"iPod1,1": @"iPod 1st Gen", @"iPod2,1": @"iPod 2nd Gen", @"iPod3,1": @"iPod 3rd Gen", @"iPod4,1": @"iPod 4th Gen", @"iPod5,1": @"iPod 5th Gen", @"iPod7,1": @"iPod 6th Gen", }; NSString *deviceName = commonNamesDictionary[machineName]; if (deviceName == nil) { deviceName = machineName; } return deviceName; }
我已经在类中添加了这个实现和其他一些方便的实用方法,并将其放在这个GitHub存储库中 。 而且你也可以在这个Wiki页面找到最新的设备信息列表。
请访问它并使用它。
更新:
您可能需要导入sys框架,
#import <sys/utsname.h>
Swift 3兼容
// MARK: - UIDevice Extension - private let DeviceList = [ /* iPod 5 */ "iPod5,1": "iPod Touch 5", /* iPhone 4 */ "iPhone3,1": "iPhone 4", "iPhone3,2": "iPhone 4", "iPhone3,3": "iPhone 4", /* iPhone 4S */ "iPhone4,1": "iPhone 4S", /* iPhone 5 */ "iPhone5,1": "iPhone 5", "iPhone5,2": "iPhone 5", /* iPhone 5C */ "iPhone5,3": "iPhone 5C", "iPhone5,4": "iPhone 5C", /* iPhone 5S */ "iPhone6,1": "iPhone 5S", "iPhone6,2": "iPhone 5S", /* iPhone 6 */ "iPhone7,2": "iPhone 6", /* iPhone 6 Plus */ "iPhone7,1": "iPhone 6 Plus", /* iPhone 6S */ "iPhone8,1": "iPhone 6S", /* iPhone 6S Plus */ "iPhone8,2": "iPhone 6S Plus", /* iPhone SE */ "iPhone8,4": "iPhone SE", /* iPhone 7 */ "iPhone9,1": "iPhone 7", /* iPhone 7 */ "iPhone9,3": "iPhone 7", /* iPhone 7 Plus */ "iPhone9,2": "iPhone 7 Plus", /* iPhone 7 Plus */ "iPhone9,4": "iPhone 7 Plus", /* iPad 2 */ "iPad2,1": "iPad 2", "iPad2,2": "iPad 2", "iPad2,3": "iPad 2", "iPad2,4": "iPad 2", /* iPad 3 */ "iPad3,1": "iPad 3", "iPad3,2": "iPad 3", "iPad3,3": "iPad 3", /* iPad 4 */ "iPad3,4": "iPad 4", "iPad3,5": "iPad 4", "iPad3,6": "iPad 4", /* iPad Air */ "iPad4,1": "iPad Air", "iPad4,2": "iPad Air", "iPad4,3": "iPad Air", /* iPad Air 2 */ "iPad5,1": "iPad Air 2", "iPad5,3": "iPad Air 2", "iPad5,4": "iPad Air 2", /* iPad Mini */ "iPad2,5": "iPad Mini 1", "iPad2,6": "iPad Mini 1", "iPad2,7": "iPad Mini 1", /* iPad Mini 2 */ "iPad4,4": "iPad Mini 2", "iPad4,5": "iPad Mini 2", "iPad4,6": "iPad Mini 2", /* iPad Mini 3 */ "iPad4,7": "iPad Mini 3", "iPad4,8": "iPad Mini 3", "iPad4,9": "iPad Mini 3", /* iPad Pro 12.9 */ "iPad6,7": "iPad Pro 12.9", "iPad6,8": "iPad Pro 12.9", /* iPad Pro 9.7 */ "iPad6,3": "iPad Pro 9.7", "iPad6,4": "iPad Pro 9.7", /* Simulator */ "x86_64": "Simulator", "i386": "Simulator" ] extension UIDevice { static var modelName: String { var systemInfo = utsname() uname(&systemInfo) let machine = systemInfo.machine let mirror = Mirror(reflecting: machine) var identifier = "" for child in mirror.children { if let value = child.value as? Int8, value != 0 { identifier += String(UnicodeScalar(UInt8(value))) } } return DeviceList[identifier] ?? identifier } static var isIphone4: Bool { return modelName == "iPhone 5" || modelName == "iPhone 5C" || modelName == "iPhone 5S" || UIDevice.isSimulatorIPhone4 } static var isIphone5: Bool { return modelName == "iPhone 4S" || modelName == "iPhone 4" || UIDevice.isSimulatorIPhone5 } static var isIphone6: Bool { return modelName == "iPhone 6" || UIDevice.isSimulatorIPhone6 } static var isIphone6Plus: Bool { return modelName == "iPhone 6 Plus" || UIDevice.isSimulatorIPhone6Plus } static var isIpad: Bool { if UIDevice.current.model.contains("iPad") { return true } return false } static var isIphone: Bool { return !self.isIpad } /// Check if current device is iPhone4S (and earlier) relying on screen heigth static var isSimulatorIPhone4: Bool { return UIDevice.isSimulatorWithScreenHeigth(480) } /// Check if current device is iPhone5 relying on screen heigth static var isSimulatorIPhone5: Bool { return UIDevice.isSimulatorWithScreenHeigth(568) } /// Check if current device is iPhone6 relying on screen heigth static var isSimulatorIPhone6: Bool { return UIDevice.isSimulatorWithScreenHeigth(667) } /// Check if current device is iPhone6 Plus relying on screen heigth static var isSimulatorIPhone6Plus: Bool { return UIDevice.isSimulatorWithScreenHeigth(736) } private static func isSimulatorWithScreenHeigth(_ heigth: CGFloat) -> Bool { let screenSize: CGRect = UIScreen.main.bounds return modelName == "Simulator" && screenSize.height == heigth } }
#import <sys/utsname.h> #define HARDWARE @{@"i386": @"Simulator",@"x86_64": @"Simulator",@"iPod1,1": @"iPod Touch",@"iPod2,1": @"iPod Touch 2nd Generation",@"iPod3,1": @"iPod Touch 3rd Generation",@"iPod4,1": @"iPod Touch 4th Generation",@"iPhone1,1": @"iPhone",@"iPhone1,2": @"iPhone 3G",@"iPhone2,1": @"iPhone 3GS",@"iPhone3,1": @"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",@"iPad1,1": @"iPad",@"iPad2,1": @"iPad 2",@"iPad3,1": @"iPad 3rd Generation ",@"iPad3,4": @"iPad 4th Generation ",@"iPad2,5": @"iPad Mini",@"iPad4,4": @"iPad Mini 2nd Generation - Wifi",@"iPad4,5": @"iPad Mini 2nd Generation - Cellular",@"iPad4,1": @"iPad Air 5th Generation - Wifi",@"iPad4,2": @"iPad Air 5th Generation - Cellular"} @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; struct utsname systemInfo; uname(&systemInfo); NSLog(@"hardware: %@",[HARDWARE objectForKey:[NSString stringWithCString: systemInfo.machine encoding:NSUTF8StringEncoding]]); }
Below Function Perfectly Working on iOS7 or later version in Swift
func DeviceName()-> String { var myDeviceName : String = String() var systemInfo = [UInt8](count: sizeof(utsname), repeatedValue: 0) let model = systemInfo.withUnsafeMutableBufferPointer { (inout body: UnsafeMutableBufferPointer<UInt8>) -> String? in if uname(UnsafeMutablePointer(body.baseAddress)) != 0 { return nil } return String.fromCString(UnsafePointer(body.baseAddress.advancedBy(Int(_SYS_NAMELEN * 4)))) } let deviceNamesByCode : [String: String] = ["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", "iPhone1,1":"iPhone", "iPhone1,2":"iPhone ", "iPhone2,1":"iPhone ", "iPhone3,1":"iPhone 4", "iPhone3,2":"iPhone 4", "iPhone3,3":"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", "iPad2,1":"iPad 2", "iPad2,2":"iPad 2", "iPad2,3":"iPad 2", "iPad2,4":"iPad 2", "iPad3,1":"iPad 3", "iPad3,2":"iPad 3", "iPad3,3":"iPad 3", "iPad3,4":"iPad 4", "iPad3,5":"iPad 4", "iPad3,6":"iPad 4", "iPad4,1":"iPad Air", "iPad4,2":"iPad Air", "iPad4,3":"iPad Air", "iPad5,3":"iPad Air 2", "iPad5,4":"iPad Air 2", "iPad2,5":"iPad Mini", "iPad2,6":"iPad Mini", "iPad2,7":"iPad Mini", "iPad4,4":"iPad Mini 2", "iPad4,5":"iPad Mini 2", "iPad4,6":"iPad Mini 2", "iPad4,7":"iPad Mini 3", "iPad4,8":"iPad Mini 3", "iPad4,9":"iPad Mini 3", "iPad5,1":"iPad Mini 4", "iPad5,2":"iPad Mini 4", "iPad6,3":"iPad Pro", "iPad6,4":"iPad Pro", "iPad6,7":"iPad Pro", "iPad6,8":"iPad Pro", "AppleTV5,3":"Apple TV", "i386":"Simulator", "x86_64":"Simulator" ] if model!.characters.count > 0 { myDeviceName = deviceNamesByCode[model!]! }else{ myDeviceName = UIDevice.currentDevice().model } print("myDeviceName==\(myDeviceName)") return myDeviceName }