iOS 獲取“關于本機”中軟件版本的編譯版本號

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中,這些內核參數的設置都是文件。

  1. 打印當前所有可用內核參數
    sysctl -a
    MacTerminal中執行該命令,會打印當前所有可用內核參數的變量名和值。

  2. 從指定的文件加載系統內核參數
    sysctl -p /xxx/xxx.xxx
    如果-p后不指定文件路徑,則從/etc/sysctl.conf中加載。

  3. 讀取指定內核參數的值
    sysctl kern.osversion
    kern.osversion為內核參數的變量名。

  4. 設置指定內核參數的值
    sysctl -w kern.maxfiles=5000
    kern.maxfiles為內核參數的變量名,用variable=value的方式設置。通過該方式設置內核參數后,如果系統重啟,則所設置的值會丟失。如果想永久保留配置,則可以通過修改/etc/sysctl.conf文件來設置內核參數。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,030評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,310評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,951評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,796評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,566評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,055評論 1 322
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,142評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,303評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,799評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,683評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,899評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,409評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,135評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,520評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,757評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,528評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,844評論 2 372

推薦閱讀更多精彩內容