2008-10-01 15 views
14

Tengo un programa que necesita comportarse de forma ligeramente diferente en Tiger que en Leopard. ¿Alguien sabe de una llamada al sistema que me permitirá determinar con precisión qué versión de Mac OS X estoy ejecutando? He encontrado una serie de definiciones de macro para determinar el sistema operativo de la máquina de compilación, pero nada realmente bueno para determinar el sistema operativo de la máquina en ejecución.¿Cómo puedo determinar la versión Mac OS X en ejecución programáticamente?

Gracias, Joe

+0

posible duplicado de [Mac OS X: Reemplazo de la Gestalt() para la versión del sistema operativo en tiempo de ejecución de pruebas] (http://stackoverflow.com/questions/11072804/mac-os-x-replacement-for-gestalt -for-testing-os-version-at-runtime) –

Respuesta

15

See this article here

Pero en fin, si usted está usando carbón, utilice la llamada Gestalt(), y si está utilizando cacao, hay una constante llamada NSAppKitVersionNumber que se puede comprobar simplemente en contra.

Editar: Para Mac OSX 10.8 y superior, no use más Gestalt(). Consulte esta respuesta para obtener más detalles: How do I determine the OS version at runtime in OS X or iOS (without using Gestalt)?

+4

como se describe en el artículo vinculado, la comprobación de NSAppKitVersionNumber no es tan buena como la versión de AppKit, no la versión de Mac OS X. Los dos no están correlacionados de forma lineal. –

+3

Aún así debería poder llamar a Gestalt() desde el código Obj-C. –

+1

La llamada Gestalt() ha quedado obsoleta desde 10.8 y ya no es recomendable su uso. Consulte http://stackoverflow.com/questions/11072804/mac-os-x-10-8-replacement-for-gestalt-for-testing-os-version-at-runtime – ctpenrose

6

En el terminal:

system_profiler SPSoftwareDataType 

Da:

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 

da:

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

Y de eso obtengo: 'sw_vers | awk '/ ProductVersion/{print $ 2}' ' Muy útil. Gracias. – csexton

2

¿La versión del sistema operativo es realmente lo que quieres? Puede haber algo más apropiado para probar, como la presencia o el número de versión de un marco particular.

+0

Una de La razón por la que estoy interesado en determinar qué versión del sistema operativo es que el soporte para la visualización estéreo del hardware dejó de funcionar correctamente en Leopard, pero continúa funcionando en Tiger. Ambas versiones indican compatibilidad, pero solo Tiger lo hace correctamente. –

12

¿Podría simplemente verificar la presencia de una capacidad? Por ejemplo:

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

o

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

entonces usted sabe que el sistema operativo hace lo que necesita hacer, no es que el grupo de marketing de producto de Apple le dio un número en particular ;-)

+0

Para la mayoría de las situaciones, esto es probablemente mejor. Gracias :) – houbysoft

0

respondsToSelector: es casi seguro que es mejor que mantener una tabla de lo que los lanzamientos concretos hacen y no implementan.

Be lazy. Deje que el tiempo de ejecución le diga si puede hacer algo o no, y recurra a métodos más antiguos cuando lo necesite. Su código será mucho menos frágil porque no tiene que mantener sus propios datos globales con los que el resto de su código debe seguir consultando.

0

Ejecutar este en la línea de comandos:

system_profiler SPSoftwareDataType | grep Mac 
1

dentro de su programa que puede utilizar la Gestalt. Aquí está el código que estoy usando para que mi programa obtenga la versión 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); 
} 
+2

Es mejor utilizar los selectores de componentes de número de versión por separado, por si acaso Apple supera 0xf en el nibble menor o de reparación de errores. (Ya han llegado a 0xb en la serie Tiger.) –

+0

Muy buen punto. gestaltSystemVersionMajor y gestaltSystemVersionMinor. Gracias. utilizará. – neoneye

Cuestiones relacionadas