如何以编程方式获取iOS的字母数字版本字符串

时间:2011-01-31 23:11:55

标签: ios objective-c

我一直在使用漂亮的PLCrashReport框架向我的服务器发送来自用户iOS设备的崩溃报告。

但是,为了表示崩溃报告, symbolicatecrash 实用程序请求与iPhone OS版本号一起使用ipsw的字母数字版本,格式为:

OS Version:      iPhone OS 4.0.1 (8A293)

我知道我可以通过[[UIDevice currentDevice] systemVersion]获取iOS的数字版本,但是如何才能获得另一个?

我无法找到方法,而且我已经搜遍了我想象的任何地方。

7 个答案:

答案 0 :(得分:28)

不确定为什么其他人说这是不可能的,因为它正在使用sysctl功能。

#import <sys/sysctl.h>    

- (NSString *)osVersionBuild {
    int mib[2] = {CTL_KERN, KERN_OSVERSION};
    u_int namelen = sizeof(mib) / sizeof(mib[0]);
    size_t bufferSize = 0;

    NSString *osBuildVersion = nil;

    // Get the size for the buffer
    sysctl(mib, namelen, NULL, &bufferSize, NULL, 0);

    u_char buildBuffer[bufferSize];
    int result = sysctl(mib, namelen, buildBuffer, &bufferSize, NULL, 0);

    if (result >= 0) {
        osBuildVersion = [[[NSString alloc] initWithBytes:buildBuffer length:bufferSize encoding:NSUTF8StringEncoding] autorelease]; 
    }

    return osBuildVersion;   
}

答案 1 :(得分:9)

为什么不尝试这个?

NSString *os_version = [[UIDevice currentDevice] systemVersion];

NSLog(@"%@", os_version);

if([[NSNumber numberWithChar:[os_version characterAtIndex:0]] intValue]>=4) {
    // ...
}

答案 2 :(得分:3)

我在将Dylan的字符串上传到PHP Web服务器时遇到问题,URL连接只会挂起,所以我修改了以下代码来修复它:

#include <sys/sysctl.h>

    - (NSString *)osVersionBuild {
        int mib[2] = {CTL_KERN, KERN_OSVERSION};
        size_t size = 0;

        // Get the size for the buffer
        sysctl(mib, 2, NULL, &size, NULL, 0);

        char *answer = malloc(size);
        int result = sysctl(mib, 2, answer, &size, NULL, 0);

        NSString *results = [NSString stringWithCString:answer encoding: NSUTF8StringEncoding];
        free(answer);
        return results;  
    }

答案 3 :(得分:1)

这没有API(至少在UIKit中没有)。请file a bug申请。

答案 4 :(得分:1)

我已经到达这里寻找如何在Swift中做到这一点的答案,经过一些测试和错误后,发现你可以写这个,至少在Xcode 9中:

print(ProcessInfo().operatingSystemVersionString)

我在模拟器中得到的输出是:

Version 11.0 (Build 15A5278f)

在一个真实的设备中:

Version 10.3.2 (Build 14F89)

希望它有所帮助。

答案 5 :(得分:0)

“另一个”是构建版本,并且您的设备无法通过UIKit使用。

答案 6 :(得分:0)

@Dylan Copeland 答案的 Swift 版本。

func systemBuild() -> String? {
    var mib: [Int32] = [CTL_KERN, KERN_OSVERSION]
    let namelen = u_int(MemoryLayout.size(ofValue: mib) / MemoryLayout.size(ofValue: mib[0]))
    var bufferSize: size_t = 0
    
    // Get the size for the buffer
    sysctl(&mib, namelen, nil, &bufferSize, nil, 0)
    
    var buildBuffer: [u_char] = .init(repeating: 0, count: bufferSize)
    
    let result = sysctl(&mib, namelen, &buildBuffer, &bufferSize, nil, 0)
    
    if result >= 0 && bufferSize > 0 {
        return String(bytesNoCopy: &buildBuffer, length: bufferSize - 1, encoding: .utf8, freeWhenDone: false)
    }
    
    return nil
}