2010-01-22 15 views
5

Sto sviluppando un'applicazione Cocoa e la necessità di verificare se l'attuale versione del sistema operativo X è OS X 10.6 Snow LeopardOS X il check-in Cocoa

Se la versione corrente è Snow Leopard, ho bisogno di chiudere l'applicazione con un avviso di errore.

Come posso trovare la versione corrente di OS X?

+3

Perché non può (non può) l'applicazione eseguita su Snow Leopard? – mipadi

risposta

1

Su sistemi UNIX è possibile utilizzare la chiamata di sistema uname(3). Vedere

$ man 3 uname 

Esempio:

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

Su Mac OS X 10.8.5 ottengo "9.8.0", come il numero di release. Vedi list of releases. 10.0 è Mac OS X 10.6, 10.2.0 è Mac OS X 10.6.2.

+0

Questo non è sicuramente il modo corretto per verificare la versione del sistema su Mac OS X. 'Gestalt' come delineato da Dave Long è il modo corretto. 'uname' non è garantito restituire nulla di utile. –

7

Ci sono un paio di modi per farlo.

  1. Si potrebbe verificare l'esistenza di una sola classe 10.6:

    Class snowLeopardOnlyClass = NSClassFromString(@"NSRunningApplication"); 
    if (snowLeopardOnlyClass != nil) { 
        NSLog(@"I'm running on Snow Leopard!"); 
    }
  2. utilizzare una funzione di sistema (come Gestalt) per determinare la versione del sistema operativo:

    #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

Il tuo secondo test fallirà su OSX 11.0 (supponendo che ci sia un 11.0 un giorno) anche se è una versione più recente. – Ferruccio

+0

@Ferruccio - buon punto; fisso. –

+0

"OS Ten Eleven-point-Oh" - sarà divertente dirlo. ;) – mipadi

9

La documentazione Apple pertinente è disponibile in Utilizzo dello sviluppo basato su SDK: Determining the Version of a Framework.

Suggeriscono di testare l'esistenza di una classe specifica o di un metodo o di verificare il numero di versione del framework, ad es. NSAppKitVersionNumber o NSFoundationVersionNumber. I framework pertinenti dichiarano anche un numero di costanti per diverse versioni os (NSApplication constants, Foundation Constants).

Il codice in questione può essere semplice come:

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

Tuttavia, ciò non funzionerà su Mac OS X 10.4. – svth

0

me Rispondere, Imimplemented la segnalazione nel main.m come segue:

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