2010-01-22 111 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); 
}