如何以编程方式确定正在运行的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);
}