美文网首页
iOS 获取“关于本机”中软件版本的编译版本号

iOS 获取“关于本机”中软件版本的编译版本号

作者: BrianWang | 来源:发表于2022-04-20 14:39 被阅读0次

    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
        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",
            
            // 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命令用于在内核运行时动态地修改内核的运行参数,即对内核参数进行设置。可用的内核参数在目录/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文件来设置内核参数。

    相关文章

      网友评论

          本文标题:iOS 获取“关于本机”中软件版本的编译版本号

          本文链接:https://www.haomeiwen.com/subject/wtkvertx.html