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

发布于 2024-07-06 15:46:38 字数 156 浏览 7 评论 0原文

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

谢谢, 乔

I have a program which needs to behave slightly differently on Tiger than on Leopard. Does anybody know of a system call which will allow me to accurately determine which version of Mac OS X I am running. I have found a number of macro definitions to determine the OS of the build machine, but nothing really good to determine the OS of the running machine.

Thanks,
Joe

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

跨年 2024-07-13 15:46:38

在此处查看这篇文章

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

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

See this article here

But in short, if you're using carbon, use the Gestalt() call, and if you're using cocoa, there is a constant called NSAppKitVersionNumber which you can simply check against.

Edit: For Mac OSX 10.8 and above, don't use Gestalt() anymore. See this answer for more details: How do I determine the OS version at runtime in OS X or iOS (without using Gestalt)?

风情万种。 2024-07-13 15:46:38

您能检查一下是否存在某种功能吗? 例如:

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

或者

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

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

Could you just check for the presence of a capability? For instance:

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

or

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

then you know that the operating system does what you need it to do, not that Apple's product marketing group gave it a particular number ;-)

月下客 2024-07-13 15:46:38

API 通过 Gestalt Manager 实现。

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

The API is through the Gestalt Manager.

See "Determining OS Version" in the CocoaDev site.

德意的啸 2024-07-13 15:46:38

在终端中:

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

In terminal:

system_profiler SPSoftwareDataType

Gives:

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

Or:

sw_vers

Gives:

ProductName:    Mac OS X
ProductVersion: 10.5.5
BuildVersion:   9F33
故事还在继续 2024-07-13 15:46:38

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

Is the OS version really what you want? There may be a more appropriate thing to test for, such as the presence of, or version number of, a particular framework.

傲娇萝莉攻 2024-07-13 15:46:38

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

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

within your program you can use Gestalt. Here is the code I am using for my program to obtain the OS version.

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);
}
多情出卖 2024-07-13 15:46:38

respondsToSelector: 几乎肯定比您维护一个给定版本实现和未实现的内容的表格更好。

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

respondsToSelector: almost certainly is better than you maintaining a table of what given releases do and do not implement.

Be lazy. Let the runtime tell you whether it can do something or not, and fall back to older methods when you need to. Your code will be far less fragile because you don't have to maintain your own global data that the rest of your code has to keep checking with.

谈情不如逗狗 2024-07-13 15:46:38

在命令行中运行此命令:

system_profiler SPSoftwareDataType | grep Mac

Run this in the command line:

system_profiler SPSoftwareDataType | grep Mac
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文