每一种 iOS 设备型号都有对应的一个或多个硬件编码/标识符,称为 device model 或者叫 machine name
通常的做法是,先获取设备的 device model 值,再手动映射为具体的设备型号(或者直接把 device model 值传给后端,让后端去做映射,这样的好处是可以随时兼容新设备)。
完整的 device mode 数据参考 Wiki:https://www.theiphonewiki.com/wiki/Models
我们可以先获取 device model 值,记为 internalName ,然后进行对比判断,转换成具体的设备型号。实现代码如下图所示:
+ (NSString *)deviceName {
struct utsname systemInfo;
uname(&systemInfo);
NSString *internalName = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
NSDictionary *dict = @{
// iPhone
@"iPhone1,1" : @"iPhone",
@"iPhone1,2" : @"iPhone 3G",
@"iPhone2,1" : @"iPhone 3GS",
@"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 (1st generation)",
@"iPhone9,1" : @"iPhone 7",
@"iPhone9,3" : @"iPhone 7",
@"iPhone9,2" : @"iPhone 7 Plus",
@"iPhone9,4" : @"iPhone 7 Plus",
@"iPhone10,1" : @"iPhone 8",
@"iPhone10,4" : @"iPhone 8",
@"iPhone10,2" : @"iPhone 8 Plus",
@"iPhone10,5" : @"iPhone 8 Plus",
@"iPhone10,3" : @"iPhone X",
@"iPhone10,6" : @"iPhone X",
@"iPhone11,8" : @"iPhone XR",
@"iPhone11,2" : @"iPhone XS",
@"iPhone11,6" : @"iPhone XS Max",
@"iPhone11,4" : @"iPhone XS Max",
@"iPhone12,1" : @"iPhone 11",
@"iPhone12,3" : @"iPhone 11 Pro",
@"iPhone12,5" : @"iPhone 11 Pro Max",
@"iPhone12,8" : @"iPhone SE (2nd generation)",
@"iPhone13,1" : @"iPhone 12 mini",
@"iPhone13,2" : @"iPhone 12",
@"iPhone13,3" : @"iPhone 12 Pro",
@"iPhone13,4" : @"iPhone 12 Pro Max",
@"iPhone14,4" : @"iPhone 13 mini",
@"iPhone14,5" : @"iPhone 13",
@"iPhone14,2" : @"iPhone 13 Pro",
@"iPhone14,3" : @"iPhone 13 Pro Max",
@"iPhone14,6" : @"iPhone SE (3rd generation)",
@"iPhone14,7" : @"iPhone 14",
@"iPhone14,8" : @"iPhone 14 Plus",
@"iPhone15,2" : @"iPhone 14 Pro",
@"iPhone15,3" : @"iPhone 14 Pro Max",
// iPad
@"iPad1,1" : @"iPad",
@"iPad2,1" : @"iPad 2",
@"iPad2,2" : @"iPad 2",
@"iPad2,3" : @"iPad 2",
@"iPad2,4" : @"iPad 2",
@"iPad3,1" : @"iPad (3rd generation)",
@"iPad3,2" : @"iPad (3rd generation)",
@"iPad3,3" : @"iPad (3rd generation)",
@"iPad3,4" : @"iPad (4th generation)",
@"iPad3,5" : @"iPad (4th generation)",
@"iPad3,6" : @"iPad (4th generation)",
@"iPad6,11" : @"iPad (5th generation)",
@"iPad6,12" : @"iPad (5th generation)",
@"iPad7,5" : @"iPad (6th generation)",
@"iPad7,6" : @"iPad (6th generation)",
@"iPad7,11" : @"iPad (7th generation)",
@"iPad7,12" : @"iPad (7th generation)",
// iPad Air
@"iPad4,1" : @"iPad Air",
@"iPad4,2" : @"iPad Air",
@"iPad4,3" : @"iPad Air",
@"iPad5,3" : @"iPad Air 2",
@"iPad5,4" : @"iPad Air 2",
@"iPad11,3" : @"iPad Air (3rd generation)",
@"iPad11,4" : @"iPad Air (3rd generation)",
// iPad Pro
@"iPad6,7" : @"iPad Pro (12.9-inch)",
@"iPad6,8" : @"iPad Pro (12.9-inch)",
@"iPad6,3" : @"iPad Pro (9.7-inch)",
@"iPad6,4" : @"iPad Pro (9.7-inch)",
@"iPad7,1" : @"iPad Pro (12.9-inch) (2nd generation)",
@"iPad7,2" : @"iPad Pro (12.9-inch) (2nd generation)",
@"iPad7,3" : @"iPad Pro (10.5-inch)",
@"iPad7,4" : @"iPad Pro (10.5-inch)",
@"iPad8,1" : @"iPad Pro (11-inch)",
@"iPad8,2" : @"iPad Pro (11-inch)",
@"iPad8,3" : @"iPad Pro (11-inch)",
@"iPad8,4" : @"iPad Pro (11-inch)",
@"iPad8,5" : @"iPad Pro (12.9-inch) (3rd generation)",
@"iPad8,6" : @"iPad Pro (12.9-inch) (3rd generation)",
@"iPad8,7" : @"iPad Pro (12.9-inch) (3rd generation)",
@"iPad8,8" : @"iPad Pro (12.9-inch) (3rd generation)",
@"iPad8,9" : @"iPad Pro (11-inch) (2nd generation)",
@"iPad8,10" : @"iPad Pro (11-inch) (2nd generation)",
@"iPad8,11" : @"iPad Pro (12.9-inch) (4th generation)",
@"iPad8,12" : @"iPad Pro (12.9-inch) (4th generation)",
// iPad mini
@"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",
@"iPad11,1" : @"iPad mini (5th generation)",
@"iPad11,2" : @"iPad mini (5th generation)",
//other
@"i386":@"iPhone Simulator",
@"x86_64":@"iPhone Simulator",
};
NSString *model = [dict objectForKey:internalName];
if (model.length == 0) {
model = internalName;
}
return model;
}