2011-10-11 7 views
8

Estoy intentando utilizar una biblioteca que tiene sabores iOS5 e iOS4.3. El problema que estoy teniendo es conseguir la versión correcta incluido condicionalmente, es decir:Cabeceras condicionalmente incluidas según la versión de iOS

para IOS5:

#include ios5stuff.h 
@implementation 
    // do stuff 
@end 

Para iOS4

#include ios4stuff.h 
@implementation 
    // do stuff 
@end 

puedo ver cómo incluir condicionalmente cosas dentro de la clase de bloque de implementación, pero no fuera de esto. ¿Alguien puede sugerir la mejor manera de hacer esto?

+0

Posible duplicado: http://stackoverflow.com/questions/1864114/how-to-detect-iphone-os-version-using-macros – IronMensan

Respuesta

17

Usted debe ser capaz de hacer esto (no probado):

#import <Availability.h> 

#if defined(__IPHONE_5_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_5_0 
#import "my_header_for_io5_and_above.h" 
#elif defined(__IPHONE_4_3) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_4_3 
#import "my_header_for_ios4.3.h" 
#else 
#error Your SDK is too old ! Need at least 4.3. 
#endif 
+0

¡Gracias - parece funcionar maravillosamente! – TimD

+0

¿Dónde puedo encontrar información para usar definida (__ IPHONE_5_0) o __IPHONE_OS_VERSION_MAX_ALLOWED? –

1

Si nos fijamos en las cabeceras de la Fundación (NSString, NSData ...) hay un montón de

#if MAC_OS_X_VERSION_10_6 <= MAC_OS_X_VERSION_MAX_ALLOWED || __IPHONE_4_0 <= __IPHONE_OS_VERSION_MAX_ALLOWED 
/* ... */ 
#endif 

También hay una definición para

__IPHONE_OS_VERSION_MIN_REQUIRED 
+2

Estas son directivas de tiempo de compilación, por lo tanto, si está compilando con iOS 5 SDK, están incluidos. – rckoenes

0

puede utilizar this método o la que dice DarkDust y comprobar la versión del IOS SDK cuando compila, pero normalmente lo que es más agradable es si maneja algunas de estas cosas en tiempo de ejecución ya que los usuarios pueden actualizar sus dispositivos y luego adoptar mágicamente nuevas características u obtener una mejor integración del sistema operativo.

Hay un par de formas de hacerlo. En SDKS más nuevos debe tener NS_CLASS_AVAILABLE. Sin embargo, si todavía está soportando SDK anteriores, puede que no. Pero esto es Objective-C, por lo que la suerte está de nuestro lado:

Class cls = NSClassFromString (@"NSRegularExpression"); 
if (cls) { 
    // Create an instance of the class and use it. 
} else { 
    // Alternate code path to follow when the 
    // class is not available. 
} 

Básicamente, la forma en que esto funciona es el sistema le pregunta si un tipo de clase está disponible, si no, se devuelve un valor nulo. Esto es algo peligroso si no se prueba porque es una cadena y se compilará, pero debería poder manejarlo.

Si se trata de una clase que existe en ambos lugares, se puede comprobar la disponibilidad de selección en tiempo de ejecución así:

if([TheAppleClass instancesRespondToSelector:@selector(aMethod:)]) { 
    // invoke the inherited method 
    [myInstance aMethod:parameter]; 
} 

reference1reference2

De esta manera se podría proporcionar una formación que todavía apoya OS4. 2 usuarios con una hoja de tweets personalizada, pero cuando se actualizan, obtienen automáticamente la integración de Twitter del sistema operativo. Sin embargo, todavía está todo en una sola compilación que puede lanzar cuando lo desee sin tener que esperar que el 90% del mercado se actualice antes de comenzar a alienar a los usuarios de sistemas operativos más antiguos.

+1

El póster dijo que necesita importar un encabezado diferente, según el SDK con el que se vincule. Así que las soluciones de tiempo de ejecución obviamente son demasiado tarde ;-) – DarkDust

+0

Sí, sé lo que pidió, y la tuya es una respuesta real a la pregunta. Estoy desafiando esa necesidad. – slf

+0

Desafortunadamente, necesito importar diferentes encabezados, pero ese es un resumen realmente útil para verificar el estado de las cosas en tiempo de ejecución, gracias. – TimD

Cuestiones relacionadas