iPhone “設置” -> “通用“ -> “關于本機” 中的軟件編譯版本號如下圖所示:
關于本機中的軟件編譯版本號
那么如何通過代碼去獲取軟件編譯版本號呢?其實我們可以通過sysctlbyname()
函數去獲取,該函數用于獲取操作系統有關內核和硬件的詳細信息。
1. 獲取“關于本機”中前三項內容
1.1 名稱
NSString *deviceName = [[UIDevice currentDevice] name];
NSLog(@"名稱: %@", deviceName);
1.2 軟件版本
NSString *systemVersion = [[UIDevice currentDevice] systemVersion];
// kern.osproductversion 例如: 15.4
// NSString *systemVersion = [self readSystemInfoByName:"kern.osproductversion"];
// kern.osversion 例如: 19E241
NSString *systemBuildVersion = [self readSystemKernelInfoByID:KERN_OSVERSION];
NSLog(@"軟件版本: %@ (%@)", systemVersion, systemBuildVersion);
1.3 型號名稱
NSString *deviceModelName = [self deviceModelName];
// hw.product 例如: iPhone10,3
// NSString *deviceMode = [self readSystemHardwareInfoByID:HW_PRODUCT];
NSLog(@"型號名稱: %@", deviceModelName);
2. 讀取系統內核信息及系統硬件信息的方法
/// 讀取系統內核信息
/// @param ID 信息標識, 范圍: [KERN_OSTYPE, KERN_MAXID)
- (NSString *)readSystemKernelInfoByID:(UInt8)ID {
// 需要導入: #import <sys/sysctl.h>
NSString *info = nil;
// ID范圍: [KERN_OSTYPE, KERN_MAXID)
if (ID >= KERN_MAXID) {
return info;
}
struct ctlname ctlNames[] = CTL_NAMES;
struct ctlname ctlName = ctlNames[CTL_KERN];
// 內核信息標識列表
struct ctlname names[] = CTL_KERN_NAMES;
struct ctlname name = names[ID];
// 拼接信息名稱 (例如: kern.osrelease)
char *infoName = malloc(64);
strcat(infoName, ctlName.ctl_name);
strcat(infoName, ".");
strcat(infoName, name.ctl_name);
// NSLog(@"Kernel infoName: %s", infoName);
size_t size;
sysctlbyname(infoName, NULL, &size, NULL, 0);
if (name.ctl_type == CTLTYPE_STRING) {
char *var = malloc(size);
sysctlbyname(infoName, var, &size, NULL, 0);
if (var != NULL) {
info = [NSString stringWithCString:var encoding:NSUTF8StringEncoding];
}
free(var);
} else if (name.ctl_type == CTLTYPE_INT) {
int64_t var;
sysctlbyname(infoName, &var, &size, NULL, 0);
info = [NSString stringWithFormat:@"%lld", var];
}
free(infoName);
return info;
}
/// 讀取系統硬件信息
/// @param ID 信息標識, 范圍: [HW_MACHINE, HW_MAXID)
- (NSString *)readSystemHardwareInfoByID:(UInt8)ID {
// 需要導入: #import <sys/sysctl.h>
NSString *info = nil;
// ID范圍: [HW_MACHINE, HW_MAXID)
if (ID >= HW_MAXID) {
return info;
}
struct ctlname ctlNames[] = CTL_NAMES;
struct ctlname ctlName = ctlNames[CTL_HW];
// 硬件信息標識列表
struct ctlname names[] = CTL_HW_NAMES;
struct ctlname name = names[ID];
// 拼接信息名稱 (例如: hw.product)
char *infoName = malloc(64);
strcat(infoName, ctlName.ctl_name);
strcat(infoName, ".");
strcat(infoName, name.ctl_name);
NSLog(@"Hardware infoName: %s", infoName);
size_t size;
sysctlbyname(infoName, NULL, &size, NULL, 0);
if (name.ctl_type == CTLTYPE_STRING) {
char *var = malloc(size);
sysctlbyname(infoName, var, &size, NULL, 0);
if (var != NULL) {
info = [NSString stringWithCString:var encoding:NSUTF8StringEncoding];
}
free(var);
} else if (name.ctl_type == CTLTYPE_INT) {
int64_t var;
sysctlbyname(infoName, &var, &size, NULL, 0);
info = [NSString stringWithFormat:@"%lld", var];
}
free(infoName);
return info;
}
/// 讀取系統信息
/// @param identifier 信息標識名稱 (C語言字符串)
- (NSString *)readSystemInfoByName:(char *)identifier {
// 需要導入: #import <sys/sysctl.h>
size_t size;
sysctlbyname(identifier, NULL, &size, NULL, 0);
char *var = malloc(size);
sysctlbyname(identifier, var, &size, NULL, 0);
NSString *info = [NSString stringWithCString:var encoding:NSUTF8StringEncoding];
free(var);
if (var == NULL) {
return nil;
} else {
return info;
}
}
3. 獲取設備型號名稱的方法
/**
設備機型
@return 設備機型,如: "iPhone X"
*/
- (NSString *)deviceModelName { // 需要導入#import "sys/utsname.h"
struct utsname systemInfo;
uname(&systemInfo);
// NSString *sysname = [NSString stringWithCString:systemInfo.sysname encoding:NSASCIIStringEncoding]; // Name of OS
// NSString *nodename = [NSString stringWithCString:systemInfo.nodename encoding:NSASCIIStringEncoding]; // Name of this network node
// NSString *release = [NSString stringWithCString:systemInfo.release encoding:NSASCIIStringEncoding]; // Release level
// NSString *version = [NSString stringWithCString:systemInfo.version encoding:NSASCIIStringEncoding]; // Version level
NSString *deviceModel = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
// Apple設備型號總覽:
// https://www.theiphonewiki.com/wiki/Models (iPhone維基不再更新,請訪問Apple維基,了解最新信息)
// https://theapplewiki.com/wiki/Models (Apple維基)
// https://appledb.dev/device-selection/iPhone.html (Apple產品數據倉庫)
NSDictionary *dic = @{
// 1. iPhone 系列
@"iPhone1,1" : @"iPhone 1G",
@"iPhone1,2" : @"iPhone 3G",
@"iPhone2,1" : @"iPhone 3GS",
@"iPhone3,1" : @"iPhone 4 (GSM)",
@"iPhone3,2" : @"iPhone 4",
@"iPhone3,3" : @"iPhone 4 (CDMA)",
@"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,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,2" : @"iPhone 7 Plus",
@"iPhone9,3" : @"iPhone 7",
@"iPhone9,4" : @"iPhone 7 Plus",
@"iPhone10,1" : @"iPhone 8",
@"iPhone10,2" : @"iPhone 8 Plus",
@"iPhone10,3" : @"iPhone X",
@"iPhone10,4" : @"iPhone 8",
@"iPhone10,5" : @"iPhone 8 Plus",
@"iPhone10,6" : @"iPhone X",
@"iPhone11,2" : @"iPhone Xs",
@"iPhone11,4" : @"iPhone Xs Max",
@"iPhone11,6" : @"iPhone Xs Max",
@"iPhone11,8" : @"iPhone XR",
@"iPhone12,1" : @"iPhone 11",
@"iPhone12,3" : @"iPhone 11 Pro",
@"iPhone12,5" : @"iPhone 11 Pro Max",
@"iPhone12,8" : @"iPhone SE 2",
@"iPhone13,1" : @"iPhone 12 mini",
@"iPhone13,2" : @"iPhone 12",
@"iPhone13,3" : @"iPhone 12 Pro",
@"iPhone13,4" : @"iPhone 12 Pro Max",
@"iPhone14,2" : @"iPhone 13 Pro",
@"iPhone14,3" : @"iPhone 13 Pro Max",
@"iPhone14,4" : @"iPhone 13 mini",
@"iPhone14,5" : @"iPhone 13",
@"iPhone14,6" : @"iPhone SE 3",
@"iPhone14,7" : @"iPhone 14",
@"iPhone14,8" : @"iPhone 14 Plus",
@"iPhone15,2" : @"iPhone 14 Pro",
@"iPhone15,3" : @"iPhone 14 Pro Max",
@"iPhone15,4" : @"iPhone 15",
@"iPhone15,5" : @"iPhone 15 Plus",
@"iPhone16,1" : @"iPhone 15 Pro",
@"iPhone16,2" : @"iPhone 15 Pro Max",
@"iPhone17,1" : @"iPhone 16 Pro",
@"iPhone17,2" : @"iPhone 16 Pro Max",
@"iPhone17,3" : @"iPhone 16",
@"iPhone17,4" : @"iPhone 16 Plus",
// 2. iPod 系列
@"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",
@"iPod9,1" : @"iPod touch 7",
// 3. iPad 系列
// iPad
@"iPad1,1" : @"iPad 1",
@"iPad2,1" : @"iPad 2 (WiFi)",
@"iPad2,2" : @"iPad 2 (GSM)",
@"iPad2,3" : @"iPad 2 (CDMA)",
@"iPad2,4" : @"iPad 2",
@"iPad3,1" : @"iPad 3 (WiFi)",
@"iPad3,2" : @"iPad 3 (CDMA)",
@"iPad3,3" : @"iPad 3 (4G)",
@"iPad3,4" : @"iPad 4 (WiFi)",
@"iPad3,5" : @"iPad 4 (4G)",
@"iPad3,6" : @"iPad 4 (CDMA)",
@"iPad6,11" : @"iPad 5",
@"iPad6,12" : @"iPad 5",
@"iPad7,5" : @"iPad 6",
@"iPad7,6" : @"iPad 6",
@"iPad7,11" : @"iPad 7",
@"iPad7,12" : @"iPad 7",
@"iPad11,6" : @"iPad 8",
@"iPad11,7" : @"iPad 8",
@"iPad12,1" : @"iPad 9",
@"iPad12,2" : @"iPad 9",
// 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 3",
@"iPad11,4" : @"iPad Air 3",
@"iPad13,1" : @"iPad Air 4",
@"iPad13,2" : @"iPad Air 4",
@"iPad13,16" : @"iPad Air 5",
@"iPad13,17" : @"iPad Air 5",
// iPad Pro
@"iPad6,3" : @"iPad Pro (9.7-inch)",
@"iPad6,4" : @"iPad Pro (9.7-inch)",
@"iPad6,7" : @"iPad Pro (12.9-inch)",
@"iPad6,8" : @"iPad Pro (12.9-inch)",
@"iPad7,1" : @"iPad Pro 2 (12.9-inch)",
@"iPad7,2" : @"iPad Pro 2 (12.9-inch)",
@"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 3 (12.9-inch)",
@"iPad8,6" : @"iPad Pro 3 (12.9-inch)",
@"iPad8,7" : @"iPad Pro 3 (12.9-inch)",
@"iPad8,8" : @"iPad Pro 3 (12.9-inch)",
@"iPad8,9" : @"iPad Pro 2 (11-inch)",
@"iPad8,10" : @"iPad Pro 2 (11-inch)",
@"iPad8,11" : @"iPad Pro 4 (12.9-inch)",
@"iPad8,12" : @"iPad Pro 4 (12.9-inch)",
@"iPad13,4" : @"iPad Pro 3 (11-inch)",
@"iPad13,5" : @"iPad Pro 3 (11-inch)",
@"iPad13,6" : @"iPad Pro 3 (11-inch)",
@"iPad13,7" : @"iPad Pro 3 (11-inch)",
@"iPad13,8" : @"iPad Pro 5 (12.9-inch)",
@"iPad13,9" : @"iPad Pro 5 (12.9-inch)",
@"iPad13,10" : @"iPad Pro 5 (12.9-inch)",
@"iPad13,11" : @"iPad Pro 5 (12.9-inch)",
// iPad mini
@"iPad2,5" : @"iPad mini 1 (WiFi)",
@"iPad2,6" : @"iPad mini 1 (GSM)",
@"iPad2,7" : @"iPad mini 1 (CDMA)",
@"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 5",
@"iPad11,2" : @"iPad mini 5",
@"iPad14,1" : @"iPad mini 6",
@"iPad14,2" : @"iPad mini 6",
// 4. Apple Watch 系列
@"Watch1,1" : @"Apple Watch 38mm",
@"Watch1,2" : @"Apple Watch 42mm",
@"Watch2,3" : @"Apple Watch Series 2 38mm",
@"Watch2,4" : @"Apple Watch Series 2 42mm",
@"Watch2,6" : @"Apple Watch Series 1 38mm",
@"Watch2,7" : @"Apple Watch Series 1 42mm",
@"Watch3,1" : @"Apple Watch Series 3 38mm",
@"Watch3,2" : @"Apple Watch Series 3 42mm",
@"Watch3,3" : @"Apple Watch Series 3 38mm",
@"Watch3,4" : @"Apple Watch Series 3 42mm",
@"Watch4,1" : @"Apple Watch Series 4 40mm",
@"Watch4,2" : @"Apple Watch Series 4 44mm",
@"Watch4,3" : @"Apple Watch Series 4 40mm",
@"Watch4,4" : @"Apple Watch Series 4 44mm",
@"Watch5,1" : @"Apple Watch Series 5 40mm",
@"Watch5,2" : @"Apple Watch Series 5 44mm",
@"Watch5,3" : @"Apple Watch Series 5 40mm",
@"Watch5,4" : @"Apple Watch Series 5 44mm",
@"Watch5,9" : @"Apple Watch SE 40mm",
@"Watch5,10" : @"Apple Watch SE 44mm",
@"Watch5,11" : @"Apple Watch SE 40mm",
@"Watch5,12" : @"Apple Watch SE 44mm",
@"Watch6,1" : @"Apple Watch Series 6 40mm",
@"Watch6,2" : @"Apple Watch Series 6 44mm",
@"Watch6,3" : @"Apple Watch Series 6 40mm",
@"Watch6,4" : @"Apple Watch Series 6 44mm",
@"Watch6,6" : @"Apple Watch Series 7 41mm",
@"Watch6,7" : @"Apple Watch Series 7 45mm",
@"Watch6,8" : @"Apple Watch Series 7 41mm",
@"Watch6,9" : @"Apple Watch Series 7 45mm",
// 5. Apple TV 系列
@"AppleTV1,1" : @"Apple TV 1",
@"AppleTV2,1" : @"Apple TV 2",
@"AppleTV3,1" : @"Apple TV 3",
@"AppleTV3,2" : @"Apple TV 3",
@"AppleTV5,3" : @"Apple TV 4",
@"AppleTV6,2" : @"Apple TV 4K",
@"AppleTV11,1" : @"Apple TV 4K 2",
// 6. AirPods 系列
@"AirPods1,1" : @"AirPods 1",
@"AirPods1,2" : @"AirPods 2",
@"AirPods2,1" : @"AirPods 2",
@"AirPods1,3" : @"AirPods 3",
@"Audio2,1" : @"AirPods 3",
@"AirPods2,2" : @"AirPods Pro",
@"AirPodsPro1,1" : @"AirPods Pro",
@"iProd8,1" : @"AirPods Pro",
@"iProd8,6" : @"AirPods Max",
@"AirPodsMax1,1" : @"AirPods Max",
// 7. HomePod 系列
@"AudioAccessory1,1" : @"HomePod",
@"AudioAccessory1,2" : @"HomePod",
// 8. Apple Pencil 系列 (暫時未知)
// @"Unknown" : @"Apple Pencil",
// @"Unknown" : @"Apple Pencil 2",
// 9. Smart Keyboard 系列 (暫時未知)
// @"Unknown" : @"Smart Keyboard",
// @"Unknown" : @"Smart Keyboard Folio",
// 10. Siri Remote 系列 (暫時未知)
// @"Unknown" : @"Siri Remote",
// @"Unknown" : @"Siri Remote 2",
// @"Unknown" : @"Siri Remote 3",
// 11. AirTag
@"AirTag1,1" : @"AirTag",
// 模擬器
@"i386" : @"Simulator x86",
@"x86_64" : @"Simulator x64",
};
NSString *name = dic[deviceModel];
if (!name) {
name = deviceModel;
}
return name;
}
4. sysctl() 相關知識
sysctl()
和sysctlbyname()
都是標準的UNIX函數,用于獲取操作系統有關內核和硬件的詳細信息。
sysctl
命令用于在內核運行時動態地修改內核的運行參數,即對內核參數進行設置??捎玫膬群藚翟谀夸?code>/proc/sys中,這些內核參數的設置都是文件。
打印當前所有可用內核參數
sysctl -a
在Mac的Terminal中執行該命令,會打印當前所有可用內核參數的變量名和值。從指定的文件加載系統內核參數
sysctl -p /xxx/xxx.xxx
如果-p
后不指定文件路徑,則從/etc/sysctl.conf
中加載。讀取指定內核參數的值
sysctl kern.osversion
kern.osversion
為內核參數的變量名。設置指定內核參數的值
sysctl -w kern.maxfiles=5000
kern.maxfiles
為內核參數的變量名,用variable=value
的方式設置。通過該方式設置內核參數后,如果系統重啟,則所設置的值會丟失。如果想永久保留配置,則可以通過修改/etc/sysctl.conf
文件來設置內核參數。