如何以编程方式确定正在运行的Mac OS X版本?
时间:2020-03-06 14:58:38 来源:igfitidea点击:
我有一个程序,该程序在Tiger上的行为与在Leopard上的行为略有不同。是否有人知道系统调用,这将使我能够准确确定我正在运行的Mac OS X版本。我发现了许多宏定义可以确定构建计算机的操作系统,但是确定运行机器的操作系统并没有什么好用的。
谢谢,
乔
解决方案
在终端:
system_profiler SPSoftwareDataType
给出:
Software: System Software Overview: System Version: Mac OS X 10.5.5 (9F33) Kernel Version: Darwin 9.5.0 Boot Volume: Main Boot Mode: Normal Computer Name: phoenix User Name: Douglas F Shearer (dougal) Time since boot: 2 days 16:55
或者:
sw_vers
给出:
ProductName: Mac OS X ProductVersion: 10.5.5 BuildVersion: 9F33
在这里看到这篇文章
但是简而言之,如果我们使用的是碳,请使用Gestalt()调用,如果我们使用的是可可,则有一个名为NSAppKitVersionNumber的常量可以简单地进行检查。
编辑:对于Mac OSX 10.8及更高版本,不要再使用Gestalt()了。请参阅此答案以获取更多详细信息:如何在运行时在OS X或者iOS中确定OS版本(不使用Gestalt)?
该API通过格式塔管理器进行。
请参阅CocoaDev站点中的"确定操作系统版本"。
操作系统版本真的是我们想要的吗?可能需要测试更合适的东西,例如特定框架的存在或者版本号。
我们能检查一下功能的存在吗?例如:
if (NSClassFromString(@"NSKeyedArchiver") != Nil)
或者
if ([arrayController respondsToSelector: @selector(selectedIndexes)])
那么我们就会知道操作系统可以完成我们需要做的事情,而不是苹果的产品营销小组为它指定了一个特定的编号;-)
respondsToSelector:
几乎可以肯定比维护一张给定版本可以实现和不可以实现的表要好。
偷懒。让运行时告诉我们它是否可以执行某些操作,并在需要时使用旧方法。代码将不那么脆弱,因为我们不必维护自己的全局数据,而其余的代码则需要继续检查。
在命令行中运行此命令:
system_profiler SPSoftwareDataType | grep Mac
在程序中,我们可以使用格式塔。这是我用于程序获取OS版本的代码。
long version = 0; OSStatus rc0 = Gestalt(gestaltSystemVersion, &version); if((rc0 == 0) && (version >= 0x1039)) { // will work with version 10.3.9 // works best with version 10.4.9 return; // version is good } if(rc0) { printf("gestalt rc=%i\n", (int)rc0); } else { printf("gestalt version=%08x\n", version); }