获取真实macOS版本遇异常:本地与Jenkins构建结果不一致
macOS版本获取差异问题解析与解决方案
这是因为macOS Big Sur(11.x及以上)引入了版本兼容性映射机制——当你的项目部署目标(Deployment Target)设置低于11.0时,NSProcessInfo的operatingSystemVersion会返回10.16作为主版本号,而非真实的11.x版本,以此兼容旧代码对系统版本的判断逻辑。本地构建和Jenkins远程构建的部署目标设置不一致,才导致返回结果不同。
1. 统一部署目标设置
检查Jenkins构建环境中的项目部署目标,将其设置为11.0或更高,这样operatingSystemVersion就会返回真实的系统版本号。
2. 使用更可靠的API获取真实版本
如果需要兼容低版本部署目标同时获取真实系统版本,可以选择以下方式:
方式一:直接读取完整版本字符串
使用NSProcessInfo的operatingSystemVersionString属性,它会返回包含真实版本的完整字符串,不受部署目标影响:
NSString *realOSVersionString = [[NSProcessInfo processInfo] operatingSystemVersionString]; // 示例输出:"Version 11.5.1 (Build 20G80)"
方式二:通过底层API读取精确版本号
使用sysctlbyname直接从系统内核获取版本信息,这是最底层且不受兼容性映射影响的方式:
#include <sys/sysctl.h> NSString *getRealMacOSVersion() { size_t size = 0; sysctlbyname("kern.osproductversion", NULL, &size, NULL, 0); char *version = malloc(size); sysctlbyname("kern.osproductversion", version, &size, NULL, 0); NSString *versionString = [NSString stringWithUTF8String:version]; free(version); return versionString; } // 示例返回:"11.5.1"
方式三:版本兼容性判断推荐API
如果你的需求是做版本兼容性判断(而非获取版本号展示),苹果推荐使用isOperatingSystemAtLeastVersion:方法,它会自动处理兼容性映射,无需关心版本号的显示问题:
NSOperatingSystemVersion minimumVersion = {.majorVersion = 11, .minorVersion = 0, .patchVersion = 0}; if ([[NSProcessInfo processInfo] isOperatingSystemAtLeastVersion:minimumVersion]) { // 运行在Big Sur及以上版本 }
内容的提问来源于stack exchange,提问作者Alexander Dyagilev
相关产品推荐
相关产品推荐

