2008-10-01 4 views
14

Ich habe ein Programm, das sich auf Tiger etwas anders verhalten muss als auf Leopard. Kennt irgendjemand einen Systemaufruf, der es mir erlaubt, genau zu bestimmen, welche Version von Mac OS X ich verwende. Ich habe eine Anzahl von Makrodefinitionen gefunden, um das Betriebssystem der Erstellungsmaschine zu bestimmen, aber nichts wirklich Gutes, um das Betriebssystem der laufenden Maschine zu bestimmen.Wie kann ich die laufende Mac OS X-Version programmgesteuert ermitteln?

Danke, Joe

+0

möglich Duplikat [Mac OS X: Ersatz für Gestalt() zum Testen OS-Version zur Laufzeit] (http://stackoverflow.com/questions/11072804/mac-os-x-replacement-for-gestalt -für-testing-os-version-at-runtime) –

Antwort

15

See this article here

Aber kurz gesagt, wenn Sie Kohlenstoff verwenden, die Gestalt() -Aufruf verwenden, und wenn Sie mit Kakao, gibt es eine Konstante genannt NSAppKitVersionNumber, die man einfach gegen überprüfen können.

Bearbeiten: Verwenden Sie für Mac OSX 10.8 und höher nicht mehr Gestalt(). Finden Sie diese Antwort für weitere Details: How do I determine the OS version at runtime in OS X or iOS (without using Gestalt)?

+4

wie im verknüpften Artikel beschrieben, ist die Überprüfung gegen NSAppKitVersionNumber nicht so gut, da es Ihnen die Version von AppKit, nicht die Version von Mac OS X sagt. Die beiden sind nicht linear korreliert. –

+3

Sie sollten GestaltA weiterhin vom Obj-C-Code aus aufrufen können. –

+1

Der Aufruf von Gestalt() ist seit 10.8 veraltet und wird nicht mehr empfohlen. Siehe http://stackoverflow.com/questions/11072804/mac-os-x-10-8-replacement-for-gestalt-for-testing-os-version-at-runtime – ctpenrose

6

Im Terminal:

system_profiler SPSoftwareDataType 

Gibt:

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 

Oder:

sw_vers 

Gibt:

ProductName: Mac OS X 
ProductVersion: 10.5.5 
BuildVersion: 9F33 
+1

Und davon bekomme ich: 'sw_vers | awk '/ ProductVersion/{print $ 2}' ' Sehr hilfreich. Vielen Dank. – csexton

2

Ist die Betriebssystemversion wirklich was Sie wollen? Es kann eine geeignetere Sache geben, auf die getestet werden soll, wie das Vorhandensein oder die Versionsnummer eines bestimmten Frameworks.

+0

Einer von Der Grund dafür ist, dass ich daran interessiert bin, zu ermitteln, welche OS-Version die Unterstützung für Hardware-Stereo-Visualisierung in Leopard nicht mehr richtig funktioniert, aber weiterhin in Tiger funktioniert. Beide Versionen zeigen Unterstützung dafür an, aber nur Tiger tut es richtig. –

12

Können Sie nur nach dem Vorhandensein einer Funktion suchen? Zum Beispiel:

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

oder

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

dann wissen Sie, dass das Betriebssystem tut, was müssen Sie es zu tun ist, nicht, dass Apples Produkt-Marketing-Gruppe gab es eine bestimmte Anzahl ;-)

+0

Für die meisten Situationen ist dies wahrscheinlich besser. Danke :) – houbysoft

0

respondsToSelector: ist fast sicher besser als Sie eine Tabelle zu halten, was bestimmte Releases tun und nicht implementieren.

Sei faul. Lassen Sie sich von der Runtime sagen, ob sie etwas tun kann oder nicht, und greifen Sie bei Bedarf auf ältere Methoden zurück. Ihr Code wird viel weniger anfällig sein, da Sie nicht Ihre eigenen globalen Daten pflegen müssen, mit denen der Rest Ihres Codes ständig in Verbindung steht.

0

Run dies in der Befehlszeile:

system_profiler SPSoftwareDataType | grep Mac 
1

in Ihrem Programm können Sie Gestalt verwenden. Hier ist der Code, den ich für mein Programm verwende, um die OS-Version zu erhalten.

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

Besser die separaten Versionsnummer-Komponenten-Selektoren zu verwenden, nur für den Fall, dass Apple jemals über 0xf geht, entweder im Minor- oder im Bug-Fix-Nibble. (Sie sind bereits in der Tiger-Serie auf 0xb gestiegen.) –

+0

Sehr guter Punkt. gestaltSystemVersionMajor und gestaltSystemVersionMinor. Vielen Dank. wird benutzen. – neoneye