2010-01-22 117 views
5

检查我开发一个Cocoa应用程序,需要检查当前的OS X版本是否是OS X 10.6雪豹OS X版本可可

如果当前版本是雪豹,我需要关闭与应用错误警报。

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

+3

为什么不能在Snow Leopard上运行应用程序? – mipadi 2010-01-22 06:06:19

回答

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” 的版本号。请参阅list of releases。 10.0是Mac OS X 10.6,10.2.0是Mac OS X 10.6.2。

+0

这绝对不是在Mac OS X上检查系统版本的正确方法。由Dave Long概述的“Gestalt”是正确的方法。 'uname'不保证返回任何有用的东西。 – 2010-01-22 12:28:18

7

有几种方法可以做到这一点。

  1. 你可以查看是否有10.6只类的存在:

    Class snowLeopardOnlyClass = NSClassFromString(@"NSRunningApplication"); 
    if (snowLeopardOnlyClass != nil) { 
        NSLog(@"I'm running on 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(@"I'm running on Snow Leopard (at least!)"); 
    }
+0

即使它是较新的版本,您的第二个测试将在OSX 11.0上失败(假设有一天会有11.0)。 – Ferruccio 2010-01-22 19:11:09

+0

@Ferruccio - 好点;固定。 – 2010-01-22 20:22:09

+0

“OS十一十一点哦” - 这将很有趣。 ;)解决方案#1的 – mipadi 2010-01-24 06:14:00

9

相关的Apple文档可以在中找到使用基于SDK的开发Determining the Version of a Framework

他们建议要么测试特定类或方法的存在,要么检查框架版本号,例如, NSAppKitVersionNumberNSFoundationVersionNumber。相关的框架还为不同的操作系统版本声明了许多常量(NSApplication constants,Foundation Constants)。

相关的代码可以是简单的:

if (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_5) { 
    // Code for 10.6+ goes here 
} 
+0

但是,这不适用于Mac OS X 10.4。 – svth 2011-07-29 00:20:09

0

回答自己,Imimplemented在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); 
}