Domanda

Ho un programma che deve comportarsi in modo leggermente diverso su Tiger rispetto a Leopard. Qualcuno sa di una chiamata di sistema che mi permetterà di determinare con precisione quale versione di Mac OS X sto eseguendo. Ho trovato una serie di definizioni macro per determinare il sistema operativo della macchina di compilazione, ma nulla di veramente buono per determinare il sistema operativo della macchina in esecuzione.

Grazie, Joe

È stato utile?

Soluzione

Leggi questo articolo qui

Ma in breve, se stai usando carbonio, usa la chiamata Gestalt () e se stai usando il cacao, c'è una costante chiamata NSAppKitVersionNumber che puoi semplicemente controllare contro

Modifica : per Mac OSX 10.8 e versioni successive, non utilizzare più Gestalt (). Vedi questa risposta per maggiori dettagli: Come posso determinare la versione del sistema operativo in fase di runtime in OS X o iOS (senza utilizzare Gestalt)?

Altri suggerimenti

Potresti semplicemente verificare la presenza di una capacità? Ad esempio:

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

o

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

allora sai che il sistema operativo fa quello che ti serve per farlo, non che il gruppo di marketing dei prodotti Apple gli abbia dato un numero particolare ;-)

L'API è tramite Gestalt Manager.

Vedi " Determinazione della versione del sistema operativo " nel sito CocoaDev.

Nel terminale:

system_profiler SPSoftwareDataType

si ottiene:

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

o

sw_vers

Dà:

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

La versione del sistema operativo è davvero ciò che desideri? Potrebbe esserci qualcosa di più appropriato da verificare, come la presenza o il numero di versione di un determinato framework.

all'interno del tuo programma puoi usare Gestalt. Ecco il codice che sto usando per il mio programma per ottenere la versione del sistema operativo.

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

respondsToSelector: quasi sicuramente è meglio di te mantenere una tabella di ciò che le versioni fornite fanno e non implementano.

Sii pigro. Lascia che il runtime ti dica se può fare qualcosa o meno e torna ai metodi più vecchi quando è necessario. Il tuo codice sarà molto meno fragile perché non devi conservare i tuoi dati globali con i quali il resto del codice deve continuare a controllare.

Eseguilo nella riga di comando:

system_profiler SPSoftwareDataType | grep Mac
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top