2010-01-22 10 views
5

Estoy desarrollando una aplicación Cocoa y la necesidad de comprobar si la versión actual del sistema operativo X es OS X 10.6 Snow LeopardOS comprobar en Cocoa

Si la versión actual es Snow Leopard, necesito cerrar la aplicación con una alerta de error

¿Cómo puedo encontrar la versión actual de OS X?

+3

¿Por qué la aplicación no funciona (no puede) en Snow Leopard? – mipadi

Respuesta

1

En los sistemas UNIX puede usar la llamada al sistema uname(3). Ver

$ man 3 uname 

Ejemplo:

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

En Mac OS X 10.8.5 me sale "9.8.0", como el número de versión. Ver list of releases. 10.0 es Mac OS X 10.6, 10.2.0 es Mac OS X 10.6.2.

+0

Definitivamente esta no es la manera correcta de verificar la versión del sistema en Mac OS X. 'Gestalt' como lo describe Dave Long es la forma correcta. 'uname' no garantiza devolver nada útil. –

7

Hay varias formas de hacerlo.

  1. Se puede comprobar la existencia de una única clase 10.6:

    Class snowLeopardOnlyClass = NSClassFromString(@"NSRunningApplication"); 
    if (snowLeopardOnlyClass != nil) { 
        NSLog(@"I'm running on Snow Leopard!"); 
    }
  2. utilizar una función de sistema (como Gestalt) para determinar la versión 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

Su segunda prueba fallará en OSX 11.0 (suponiendo que haya un 11.0 algún día) a pesar de que es una versión más reciente. – Ferruccio

+0

@Ferruccio - buen punto; fijo. –

+0

"OS Ten Eleven-point-Oh" - eso será divertido de decir. ;) – mipadi

9

La documentación pertinente de Apple se puede encontrar en Uso del desarrollo basado en SDK: Determining the Version of a Framework.

Sugieren probar la existencia de una clase o método específico o verificar el número de versión del marco, p. NSAppKitVersionNumber o NSFoundationVersionNumber. Los marcos relevantes también declaran una serie de constantes para diferentes versiones del sistema operativo (NSApplication constants, Foundation Constants).

El código en cuestión puede ser tan simple como:

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

Eso no funcionará en Mac OS X 10.4, sin embargo. – svth

0

Responder a mí mismo, Imimplemented la alerta en main.m de la siguiente manera:

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