在Cocoa中检查OS X版本

5

我正在开发一款Cocoa应用程序,需要检查当前的OS X版本是否为OS X 10.6 Snow Leopard。

如果当前版本是Snow Leopard,我需要关闭应用程序并显示错误提示。

如何查找当前的OS X版本?


3
为什么这个应用程序不能在Snow Leopard上运行? - mipadi
5个回答

9
相关的苹果文档可以在“使用基于SDK的开发”中找到:确定框架版本
他们建议测试特定类或方法的存在,或检查框架版本号,例如NSAppKitVersionNumberNSFoundationVersionNumber。相关框架还声明了许多不同操作系统版本的常量(NSApplication 常量Foundation 常量)。
相关代码可能只需简单地编写如下:
if (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_5) {
    // Code for 10.6+ goes here
}

7

有几种方法可以实现这个。

  1. 您可以检查是否存在一个仅适用于10.6的类:

    Class snowLeopardOnlyClass = NSClassFromString(@"NSRunningApplication");
    if (snowLeopardOnlyClass != nil) {
      NSLog(@"我正在运行Snow Leopard!");
    }
  2. 使用系统函数(如Gestalt)来确定操作系统版本:

    #import <CoreServices/CoreServices.h>
    SInt32 major = 0;
    SInt32 minor = 0;   
    Gestalt(gestaltSystemVersionMajor, &major);
    Gestalt(gestaltSystemVersionMinor, &minor);
    if ((major == 10 && minor >= 6) || major >= 11) {
      NSLog(@"我正在运行Snow Leopard(至少!)");
    }

你的第二个测试在OSX 11.0上会失败(假设将来有一个11.0版本),尽管它是一个更新的版本。 - Ferruccio

1
在UNIX系统中,您可以使用uname(3)系统调用。请参见
$ man 3 uname

例子:

#include <stdio.h>
#include <sys/utsname.h>

int main()
{
    struct utsname un;

    uname(&un);
    printf("sysname: %s\nnodename: %s\nrelease: %s\nversion: %s\nmachine: %s\n",
        un.sysname, un.nodename, un.release, un.version, un.machine);
}

在Mac OS X 10.8.5上,我得到的版本号是"9.8.0"。请参见版本列表。10.0是Mac OS X 10.6,10.2.0是Mac OS X 10.6.2。

这绝对不是在 Mac OS X 上检查系统版本的正确方法。Dave Long 指出的 Gestalt 才是正确的方法。uname 不能保证返回任何有用的信息。 - Rob Keniger

1

0

回答自己,我在main.m中实现了以下警报:

#ifndef NSAppKitVersionNumber10_5
#define NSAppKitVersionNumber10_5 949
#endif 
int main(int argc, char *argv[])
{
    SInt32 major = 0;
    SInt32 minor = 0;   
    Gestalt(gestaltSystemVersionMajor, &major);
    Gestalt(gestaltSystemVersionMinor, &minor);
    if ((major == 10 && minor >= 6) || major >= 11) {

        CFUserNotificationDisplayNotice(0, kCFUserNotificationCautionAlertLevel,NULL, NULL, NULL, CFSTR("Maestro"), CFSTR("This version is not compatible."),  CFSTR("Ok"));
        return 0;
    }
    return NSApplicationMain(argc,  (const char **) argv);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接