2009-05-20 16 views
14

Voglio ottenere la versione del sistema OS X, come ad esempio: 10.5.4, 10.4.8, ecc. Voglio averlo nella mia app, come faccio? Grazie!Come ottenere la versione del sistema OS X?

+0

@JakePetroules come questo potrebbe essere un duplicato se è stato chiesto 7 anni fa e pseudo originale - 4 anni fa! Guarda le date per favore. –

+0

Poiché l'altra domanda contiene la risposta corretta come accettata. Questo contiene tutte le risposte errate o obsolete tranne una che è molto in basso. Stack Overflow è un wiki per le persone a trovare risposte, non un registro storico di domande e risposte. –

risposta

11

È possibile utilizzare Gestalt:

SInt32 version = 0; 
Gestalt(gestaltSystemVersion, &version); 
BOOL leopard = (version >= 0x1050); 

if (leopard) 
{ 
    //draw it this way 
} 
else 
{ 
    //draw it that way 
} 

tenere a mente se si sta controllando se un metodo è disponibile o meno, è meglio verificare che l'utilizzo direttamente respondsToSelector :.

+14

Si noti che gestaltSystemVersion è scoraggiato dal 10.4 in favore di gestaltSystemVersionMajor, gestaltSystemVersionMinor e gestaltSystemVersionBugFix, a causa del limite di 1 cifra. 10.4.10 e .11, ad esempio, sono impossibili da rilevare usando il tuo codice. – smorgan

+5

Siccome Gestalt è deprecato in 10.8, esiste un modo alternativo che funzioni da 10.6 a 10.8? – adib

+4

Questa risposta ora è errata, poiché gestaltSystemVersion non può rappresentare 10.10. –

7

Ancora, è possibile utilizzare Gestalt. Guarda la documentazione per maggiori informazioni; in particolare, ti consigliamo di passare i gestaltSystemVersionMajor, gestaltSystemVersionMinor, e gestaltSystemVersionBugFix costanti nella parte di "versione del sistema Costanti" della Gestalt Manager Reference documentation

19

potete leggere l'elenco delle proprietà a "/System/Library/CoreServices/SystemVersion.plist ed estrarre la 'chiave ProductVersion', questo è come il programma di installazione di OS X fa Ecco un esempio:.

NSString *versionString; 
NSDictionary * sv = [NSDictionary dictionaryWithContentsOfFile:@"/System/Library/CoreServices/SystemVersion.plist"]; 
versionString = [sv objectForKey:@"ProductVersion"]; 

In alternativa, il comando swvers -productVersion farà lo stesso.

+0

Questo funziona, ma comporta l'I/O del disco e non è necessario. Gestalt è un'alternativa molto migliore (e più veloce). –

+2

Ma deprecato dal 10.8 e sembra che questo sia il modo migliore attualmente disponibile. Vedere questa domanda: http://stackoverflow.com/questions/11072804/mac-os-x-10-8-replacement-for-gestalt-for-testing-os-version-at-runtime – hobotron

+0

Grazie, la migliore soluzione I Ho trovato dal 10.8 –

11
NSString *osver() 
{ 
    SInt32 versionMajor=0, versionMinor=0, versionBugFix=0; 
    Gestalt(gestaltSystemVersionMajor, &versionMajor); 
    Gestalt(gestaltSystemVersionMinor, &versionMinor); 
    Gestalt(gestaltSystemVersionBugFix, &versionBugFix); 
    return [NSString stringWithFormat:@"%d.%d.%d", versionMajor, versionMinor, versionBugFix]; 
} 
+0

Proprio quello che stavo cercando. – David

+2

Purtroppo, Gestalt è obsoleto dal 10.8. –

9

-[NSProcessInfo operatingSystemVersionString] è leggibile e localizzato. Appropriato per la visualizzazione all'utente o l'utilizzo in e-mail di bug e simili, ma non appropriato per l'analisi.

+0

+1: molto bello. Ho suggerito una leggera modifica di menzionare il metodo di classe '+ processInfo' per ottenere un'istanza per chiamare' -operatingSystemVersionString' su. – ArtOfWarfare

+0

è possibile chiamare [NSProcessInfo operatingSystemVersionString] dal codice C++? – Vlad

+0

No. Dovresti creare un metodo wrapper per chiamarlo dal C++ e dovrai aggiungere qualche Objective-C al tuo programma per farlo. Puoi creare quel file Objective-C++, puoi usare Gestalt, puoi usare system() per chiamare swvers -productVersion dalla riga di comando, o puoi leggerlo dal file system (come accennato altrove in questa pagina). Dipende solo dalla tua situazione e da cosa stai cercando di fare. – brant

0

uso questo metodo verrà restituito versione di Mac OS X

+(SInt32) OSVersion; 
{ 
    SInt32 osxMinorVersion; 
    Gestalt(gestaltSystemVersionMinor, &osxMinorVersion); 
    return osxMinorVersion; 
} 
0

Dopo 10_10, 8_0 sono stati presentati il ​​meglio & modo più semplice sarebbe
[NSProcessInfo processInfo].operatingSystemVersion
che restituirà
NSOperatingSystemVersion struct
con tutta 3 numeri.

Problemi correlati