2009-05-04 15 views
36

Tengo un código que quiero ejecutar solo en el último iPhone SDK (3.0), sin embargo, parece que no puedo encontrar una manera de apuntar solo a 3.0 e ignorar 2.2.1, etc. Hay una declaración ifdef, pero parece que cubre todo el iPhone:¿Cómo apuntar a una versión específica de iPhone?

#if TARGET_OS_IPHONE 

Se agradece cualquier ayuda.

Respuesta

89

Puede utilizar esta #define para cambiar lo que se genera para cada SDK ...

#if __IPHONE_OS_VERSION_MIN_REQUIRED > __IPHONE_2_2 
// iPhone 3.0 code here 
#endif 

Y hacer esto en tiempo de ejecución para ejecutar código para la versión 3.0 y superiores:

float version = [[[UIDevice currentDevice] systemVersion] floatValue]; 
if (version >= 3.0) 
    { 
    // iPhone 3.0 code here 
    } 
+0

No lo sabía. ¡Gracias! – Kriem

+0

¡Genial, gracias! – Oliver

+10

Una cosa a tener en cuenta es que compilar para el simulador frente al dispositivo puede causar cambios sorprendentes en estas macros. Al compilar para el simulador SDK 2.2.1 obtengo __IPHONE_OS_VERSION_MIN_REQUIRED = 20000. Sin embargo, al compilar para el dispositivo, obtengo __IPHONE_OS_VERSION_MIN_REQUIRED = 20201, lo que rompe la condición que ha definido anteriormente. Actualmente estoy usando el "#ifdef __IPHONE_3_0" simple para aislar el código que solo funciona en 3.0 o superior. Eso funciona porque la macro no está definida hasta el 3.0 SDK. – n8gray

0

Está en las opciones de compilación de Xcode. El menú desplegable en la esquina superior izquierda que dice algo así como "myapp - 3.0 | Debug" Selecciona la construcción que deseas y listo, listo.

+0

El problema con este método es que quiero que mi aplicación también funcione en 2.2.1, y solo esta línea de código se ejecuta en 3.0. Su método significaría que tendría que soltar soporte para 2.2x. – Oliver

+0

Veo lo que quiere decir ahora, complicado, pero es posible que pueda hacer una comprobación exacta entonces. Diga comprobar para definir en un encabezado. –

0

Utilizando el truco de agregar OTHER_CFLAGS = "-g3 -save-temps -dD" de this answer, encontré que la definición __IPHONE_OS_VERSION_MIN_REQUIRED 20000 con un proyecto dirigido a 2.2.1. Quizás eso funcionará?

0

Estoy bastante seguro de que el comentario en el OP lo resume. No puedes. Porque una directiva de tiempo de compilación no puede tomar una decisión en tiempo de ejecución. En Xcode, si apuntas a 3.0, no se ejecutará en un teléfono 2.2.1. Si se dirige a 2.2.1, no compilará porque tiene 3.0 código específico allí.

La única solución verdadera serían dos versiones de su aplicación, una compilada para 3.0 y otra para 2.2.1.

+0

Primero: el OP no está excluyendo las comprobaciones en tiempo de compilación. 2º: hay excepciones a su regla dada. Como ejemplo, el MPMoviePlayerController existe en 3.0 y en 3.2 pero funciona de manera diferente en 3.2 (y 4.0). Para soportarlo correctamente en ambas plataformas, encontré que usar runtime-os-version-check es muy útil. En mi caso especial, omitir este control generará una compilación adecuada en ambas plataformas, pero se bloqueará en cualquier punto por debajo de 3.2. – Till

-2

Bueno, mis dos centavos:

¿Qué le parece si construye su aplicación con la última versión decir 3.0 para que pueda explotar todas las nuevas API & y especifique el destino de implementación como el menos reciente? la versión que desea admitir, de modo que los usuarios que no se tomaron un tiempo para actualizar sus dispositivos seguirán ejecutando su aplicación. En este caso, como se muestra arriba, debe verificar la versión menos reciente del SDK y proporcionar una funcionalidad alternativa para que su aplicación sea compatible con versiones anteriores.

Saludos, hardik

+0

¿Cómo ayuda esto solo a ejecutar un trozo de código en iOS 3 o superior? –

4

bastante seguro de que también se puede hacer:

#ifdef __IPHONE_3_0 
// 3.0 code here 
#endif 
+0

Tenga en cuenta que el código para ir allí es 3.0+, no solo 3.0. –

6

ACTUALIZACIÓN: Cuando la construcción de & corriendo en el iPhone (4.3.1) usando Xcode 4, esto ya no parece funcionar para yo. Además, obtengo __IPHONE_OS_VERSION_MIN_REQUIRED = 30200.

The iPhone Developer's Cookbook dice también se puede hacer:

#ifdef _USE_OS_4_OR_LATER 
    // code to compile for 4.0 or later 
#else 
    // code to compile for pre-4.0 
#endif 

Y, parece que funciona para mí. :)

+0

No encuentro dónde podría definirse eso en Foundation. ¿Dónde está? –

19

Yo tendría cuidado con el resultado de retorno floatValue:

[[[UIDevice currentDevice] systemVersion] floatValue] 

Al igual que con cualquier flotadores, puede que no sea exactamente lo que esperas.Cuando se ejecuta lo anterior en mi sistema, confundido por qué mi sentencia condicional no se estaba ejecutando, me di cuenta el valor devuelto fue:

3.20000005 

Recomendar las soluciones aquí en su lugar: How to check iOS version?

Extracto:

NSComparisonResult order = [[UIDevice currentDevice].systemVersion compare: @"3.1.3" options: NSNumericSearch]; 
if (order == NSOrderedSame || order == NSOrderedDescending) { 
    // OS version >= 3.1.3 
} else { 
    // OS version < 3.1.3 
} 
+0

¿El '3.2.00..005' sigue siendo un problema con' doubleValue'? –

+0

@ BenC.R.Leggiero debería ser. Es imposible representar 3.2 exactamente en binario, sin importar cuánta precisión use. –

+0

@BrennanVincent Creo que te refieres con flotadores IEEE, ya que es trivial representar utilizando 'NSDecimalNumber' –

Cuestiones relacionadas