La respuesta rápida ...
A partir de Swift 2.0, se puede utilizar #available
en una if
o guard
al código de protección que sólo se debe ejecutar en ciertos sistemas.
if #available(iOS 9, *) {}
En Objective-C, debe verificar la versión del sistema y realizar una comparación.
[[NSProcessInfo processInfo] operatingSystemVersion]
en iOS 8 y superior.
A partir de Xcode 9:
if (@available(iOS 9, *)) {}
La respuesta completa ...
En Objective-C y Swift en casos raros, es mejor evitar confiar en la versión del sistema operativo como una indicación de las capacidades del dispositivo o del sistema operativo. Por lo general, hay un método más confiable para verificar si una característica o clase particular está disponible.
Comprobando la presencia de API:
Por ejemplo, puede verificar si UIPopoverController
está disponible en el dispositivo actual usando NSClassFromString
:
if (NSClassFromString(@"UIPopoverController")) {
// Do something
}
Para clases débilmente vinculadas, es seguro enviar mensajes a la clase, directamente. En particular, esto funciona para marcos que no están vinculados explícitamente como "Requerido". Para las clases que faltan, la expresión se evalúa como nula y falla la condición:
if ([LAContext class]) {
// Do something
}
Algunas clases, como CLLocationManager
y UIDevice
, proporcionan métodos para verificar las capacidades del dispositivo:
if ([CLLocationManager headingAvailable]) {
// Do something
}
Comprobando la presencia de símbolos:
Muy ocasionalmente, debe verificar la presencia de una constante. Esto surgió en iOS 8 con la introducción de UIApplicationOpenSettingsURLString
, utilizado para cargar la aplicación de configuración a través de -openURL:
. El valor no existía antes de iOS 8. Pasar nulo a esta API se bloqueará, por lo que primero debe asegurarse de verificar la existencia de la constante:
if (&UIApplicationOpenSettingsURLString != NULL) {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
}
Comparando con la versión del sistema operativo:
Supongamos que enfrenta la necesidad relativamente rara de verificar la versión del sistema operativo. Para proyectos dirigidos a iOS 8 y superior, NSProcessInfo
incluye un método para realizar comparaciones de versiones con menos posibilidades de error:
- (BOOL)isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion)version
Los proyectos dirigidos a sistemas más antiguos pueden usarse systemVersion
en UIDevice
. Apple lo usa en su código de muestra GLSprite .
// A system version of 3.1 or greater is required to use CADisplayLink. The NSTimer
// class is used as fallback when it isn't available.
NSString *reqSysVer = @"3.1";
NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
if ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending) {
displayLinkSupported = TRUE;
}
Si por alguna razón decide que systemVersion
es lo que desea, asegúrese de tratarlo como una cadena o corre el riesgo de truncar el número de revisión del parche (por ejemplo, 3.1.2 -> 3.1).