2010-11-18 9 views
15

Duplicar posible:
Check iPhone iOS Version¿Cómo detectar el iOS actual es 4.1 o 4.2?

me trató con este código:

#if (__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_2_2) 
    NSLog(@"iPhone 4.2"); 
#endif 

pero cuando lo ejecuto de nuevo el simulador de 4.1, sigo teniendo el registro de "iPhone 4.2 "en la consola.

Gracias por ayudarme.

Tung Do

+7

Ambos 4.1 y 4.2 son ≥ 2.2. – kennytm

+5

# if/# endif son * directivas * en tiempo de compilación *. Todo lo que hacen es compararlo con la configuración de compilación para ver a qué versión de sistema operativo se dirige. Pero se emitirá el mismo código independientemente del sistema operativo en el que se ejecute. Desea una verificación * en tiempo de ejecución *. – benzado

+0

Pruebe este: http://jayprakashdubey.blogspot.in/2014/07/check-device-os-version.html –

Respuesta

27

probablemente debería evitar preguntar sobre la versión del sistema completo.

Un mejor diseño podría preguntar acerca de una función específica.

Por ejemplo: if (NSClassFromString(@"UIPrintInfo")) le diría si el dispositivo actual admite la API de impresión, disponible en 4.2 o superior.

De esta manera puede planificar su código para usar una característica si está disponible, no en función de la versión del sistema operativo.

+0

Gracias. Este código funciona perfecto. –

21
float version = [[[UIDevice currentDevice] systemVersion] floatValue]; 
+0

Gracias. Este código funciona como se esperaba, pero creo que la solución de Zigfried es más flexible. –

+0

mira esta publicación que tiene una buena respuesta http://www.techpaa.com/2012/11/best-way-checking-iphone-ios-version.html – ShivaPrasad

3

Regla 1: No depende de la versión o el tipo de dispositivo para determinar si una característica está disponible. Los diferentes dispositivos (iPhone, iPod Touch y iPad) pueden obtener la misma característica pero en diferentes versiones del sistema operativo. El enlace débilmente contra los marcos y las clases faltantes será nil. O use la función NSClassFromString() que también devuelve nil si una clase no existe. También use -[NSObject respondsToSelector:] para consultar si existe un método o no.

Regla 2: Apple desalienta el uso de las constantes definidas (como __IPHONE_2_2) en la comprobación de versiones, en lugar de utilizar sus valores numéricos como tal:

#if (__IPHONE_OS_VERSION_MAX_ALLOWED >= 40200) 
    NSLog(@"BUILT against iPhone 4.2 or later"); 
#endif 

Pero tomar nota usando #if tiempo de compilación directiva solo comprobará qué versión del SDK tiene compilación contra y no la versión del sistema operativo más adelante ejecutará en.

+0

este código se ejecutará incluso en iPhone 4.0 y 4.1 –

5

Usted puede hacer esto ya sea en tiempo de compilación o en tiempo de ejecución.

Por tiempo de compilación, se utilizan los llamados macros disponibilidad:

#if __IPHONE_OS_VERSION_MAX_ALLOWED > 40000 // __IPHONE_4_0 
    NSLog(@"After Version 4.0"); 
#else 
    NSLog(@"Version 4.0 or earlier"); 
#endif 

Sin embargo, el problema con el tiempo de compilación es que usted tiene que mantener múltiples binarios. Si desea que este binario se ejecute en pre-4.x, entonces debe hacer un enlace débil a las bibliotecas de iOS.

if(kCFCoreFoundationVersionNumber > kCFCoreFoundationVersionNumber_iPhoneOS_4_0) 
{ 
    NSLog(@"After Version 4.0"); 
} 
else 
{ 
    NSLog(@"Version 4.0 or earlier"); 
} 

Hay un buen tutorial aquí: http://cocoawithlove.com/2010/07/tips-tricks-for-conditional-ios3-ios32.html

+0

sí, pero quiero detectar el iPhone 4.2 con el otro. –

6

O, aún mejor:

CGFloat systemVersion = [[[ UIDevice currentDevice ] systemVersion ] floatValue ];

Luego, puede hacer una simple comprobación de igualdad, p.

if(systemVersion > 4.1){...}

Cuestiones relacionadas