我一直在使用漂亮的PLCrashReport框架向我的服务器发送来自用户iOS设备的崩溃报告。
但是,为了表示崩溃报告, symbolicatecrash 实用程序请求与iPhone OS版本号一起使用ipsw的字母数字版本,格式为:
OS Version: iPhone OS 4.0.1 (8A293)
我知道我可以通过[[UIDevice currentDevice] systemVersion]
获取iOS的数字版本,但是如何才能获得另一个?
我无法找到方法,而且我已经搜遍了我想象的任何地方。
答案 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
}