如何以编程方式确定正在运行的Mac OS X版本?

时间:2008-10-01 14:06:08

标签: cocoa macos macos-carbon

我有一个程序需要在Tiger上的行为略微不同于Leopard。有没有人知道系统调用,这将允许我准确地确定我正在运行的Mac OS X版本。我找到了许多宏定义来确定构建机器的操作系统,但确定正在运行的机器的操作系统没什么好处。

谢谢, 乔

8 个答案:

答案 0 :(得分:15)

See this article here

但简而言之,如果您使用的是碳,请使用Gestalt()调用,如果您使用的是cocoa,则会有一个名为NSAppKitVersionNumber的常量,您只需检查它即可。

编辑:对于Mac OSX 10.8及更高版本,请不要再使用Gestalt()。有关详细信息,请参阅此答案:How do I determine the OS version at runtime in OS X or iOS (without using Gestalt)?

答案 1 :(得分:12)

您能否检查是否存在功能?例如:

if (NSClassFromString(@"NSKeyedArchiver") != Nil)

if ([arrayController respondsToSelector: @selector(selectedIndexes)])

然后你知道操作系统做你需要它做的事情,而不是Apple的产品营销组给它一个特定的数字; - )

答案 2 :(得分:8)

API通过格式塔管理器。

请参阅CocoaDev网站中的“Determining OS Version”。

答案 3 :(得分:6)

在终端:

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

答案 4 :(得分:2)

操作系统版本真的是你想要的吗?可能有更合适的测试方法,例如特定框架的存在或版本号。

答案 5 :(得分:1)

在你的程序中你可以使用Gestalt。这是我用于获取操作系统版本的程序的代码。

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);
}

答案 6 :(得分:0)

respondsToSelector:几乎肯定比维护给定版本执行和未执行的内容的表更好。

懒惰。让运行时告诉您它是否可以执行某些操作,并在需要时回退到旧方法。您的代码将不那么脆弱,因为您不必维护自己的全局数据,而其余代码必须继续检查。

答案 7 :(得分:0)

在命令行中运行:

system_profiler SPSoftwareDataType | grep Mac