Macro del preprocesador de Xcode para comprobar si SDK base>=iOS 7.0
ios7 (5)
Además, puedes usar esta macro
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:(v) options:NSNumericSearch] != NSOrderedAscending)
por ejemplo, if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"6.1")) {[self doSomething];} else {[self doSomethingElse];}
¿Hay alguna macro de preprocesador para compilar ciertas partes de código solo si el SDK base es 7.0 o superior? La constante definida "__IPHONE_7_0" parece estar vinculada al objetivo de desarrollo de iOS (y no al SDK base).
Estoy usando XCode 5 con iOS 7 e iOS 6.1 instalados.
La razón por la que estoy preguntando esto es que actualmente estoy haciendo la transición de una aplicación de iOS 6 a iOS 7. Hay bastantes cosas para ajustar, y actualmente todavía me gustaría compilar mi aplicación con iOS 6.1 como SDK base (y con el objetivo de desarrollo iOS 6.0), pero ya me gustaría agregar algún código que desee siempre que compile con iOS 7 SDK, pero que no compila si el SDK base es iOS 6.1.
Ejemplo:
if ([_tableView respondsToSelector:@selector(setSeparatorInset:)]) {
[_tableView setSeparatorInset:UIEdgeInsetsZero];
}
Esta pieza de código anterior no se compila con iOS 6.1 base SDK, ya que se queja de que setSeparatorInset no está definido para UITableView. Por lo tanto, me gustaría incluir este fragmento de código dentro de una directiva de preprocesador, condicionalmente en el SDK base.
Debería leer la Guía de compatibilidad de SDK de Apple donde se explican todas esas técnicas.
En particular, recomiendan usar la macro __IPHONE_OS_VERSION_MIN_REQUIRED
para probar contra el objetivo de despliegue de su proyecto (versión mínima admitida), y para su caso usar la macro __IPHONE_OS_VERSION_MAX_ALLOWED
para probar el SDK base utilizado para la compilación .
Ejemplo:
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000
// Only COMPILE this if compiled against BaseSDK iOS7.0 or greater
if ([_tableView respondsToSelector:@selector(setSeparatorInset:)]) {
// Even when compiled with BaseSDK 7, only EXECUTE that if the user uses an
// OS that support this method (namely if the user is running iOS7 or later,
// but not for users running iOS6).
[_tableView setSeparatorInset:UIEdgeInsetsZero];
}
#endif
Nota importante: debe usar constantes numéricas en su comparación como si probara #if __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_7_0
por ejemplo, no funcionará cuando use SDK 6, ya que __IPHONE_7_0
no está definido así evaluado a 0 en ese contexto y su condición no lo hará trabajar como se espera
No debe probar el sdk, sino la disponibilidad del método / clase en mi humilde opinión. Entonces no con un precompilado en absoluto
Sí, puedes usar la definición __IPHONE_7_0
:
#ifdef __IPHONE_7_0
if ([_tableView respondsToSelector:@selector(setSeparatorInset:)]) {
[_tableView setSeparatorInset:UIEdgeInsetsZero];
}
#endif
Según Apple Doc, debes usar NSFoundationVersionNumber
para distinguir entre iOS 7 y otros. Puedes simplificarlo usando las siguientes macros:
#define isIOS6 floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1
#define isIOS7 floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1
y luego en el código do
#ifdef __IPHONE_7_0
if (isIOS7) {
// Do additional stuff for iOS 7.
}
#endif
Sí, debe verificar tanto el tiempo de compilación (con #ifdef
) como el tiempo de ejecución (con isIOS7
) de esta forma podrá compilar con iOS6 SDK, iOS7 SDK y también iOS7 SDK con un destino iOS6.
¡OH! Recuerde que no puede hacer if (!isIOS7)
tiene que usar if (isIOS6)
.
https://developer.apple.com/library/ios/documentation/userexperience/conceptual/transitionguide/