14

我有一个程序需要在 Tiger 上的行为与在 Leopard 上的行为略有不同。有谁知道系统调用可以让我准确确定正在运行的 Mac OS XI 版本。我找到了一些宏定义来确定构建机器的操作系统,但没有什么能很好地确定正在运行的机器的操作系统。

谢谢,乔

4

8 回答 8

15

在这里看到这篇文章

但简而言之,如果您使用的是 carbon,请使用 Gestalt() 调用,如果您使用的是 cocoa,则有一个名为 NSAppKitVersionNumber 的常量,您可以简单地检查它。

编辑:对于 Mac OSX 10.8 及更高版本,不要再使用 Gestalt() 了。有关更多详细信息,请参阅此答案:如何在 OS X 或 iOS 中确定运行时的操作系统版本(不使用格式塔)?

于 2008-10-01T14:13:32.430 回答
13

你能检查一个功能的存在吗?例如:

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

或者

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

那么你就知道操作系统做了你需要它做的事情,而不是苹果的产品营销团队给了它一个特定的数字;-)

于 2008-10-01T21:52:39.410 回答
8

API 通过格式塔管理器。

请参阅 CocoaDev 站点中的“确定操作系统版本”。

于 2008-10-01T14:15:27.043 回答
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
于 2008-10-01T14:10:56.837 回答
2

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

于 2008-10-01T15:19:52.397 回答
1

在您的程序中,您可以使用格式塔。这是我用于程序获取操作系统版本的代码。

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);
}
于 2009-07-28T08:07:56.077 回答
0

respondsToSelector:几乎可以肯定比你维护一个给定版本做什么和不实现的表格更好。

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

于 2008-11-21T21:29:15.710 回答
0

在命令行中运行它:

system_profiler SPSoftwareDataType | grep Mac
于 2009-03-16T20:07:45.537 回答