La réponse rapide…
Depuis Swift 2.0, vous pouvez utiliser #availabledans un ifou guardpour protéger du code qui ne doit être exécuté que sur certains systèmes.
if #available(iOS 9, *) {}
Dans Objective-C, vous devez vérifier la version du système et effectuer une comparaison.
[[NSProcessInfo processInfo] operatingSystemVersion] dans iOS 8 et supérieur.
Depuis Xcode 9:
if (@available(iOS 9, *)) {}
La réponse complète…
Dans Objective-C et Swift dans de rares cas, il est préférable d'éviter de se fier à la version du système d'exploitation comme indication des capacités de l'appareil ou du système d'exploitation. Il existe généralement une méthode plus fiable pour vérifier si une fonction ou une classe particulière est disponible.
Vérification de la présence d'API:
Par exemple, vous pouvez vérifier s'il UIPopoverControllerest disponible sur l'appareil actuel en utilisant NSClassFromString:
if (NSClassFromString(@"UIPopoverController")) {
// Do something
}
Pour les classes faiblement liées, il est sûr d'envoyer un message directement à la classe. En particulier, cela fonctionne pour les frameworks qui ne sont pas explicitement liés comme «requis». Pour les classes manquantes, l'expression est évaluée à nil, à défaut de la condition:
if ([LAContext class]) {
// Do something
}
Certaines classes, comme CLLocationManageret UIDevice, fournissent des méthodes pour vérifier les capacités des périphériques:
if ([CLLocationManager headingAvailable]) {
// Do something
}
Vérification de la présence de symboles:
Très occasionnellement, vous devez vérifier la présence d'une constante. Cela est apparu dans iOS 8 avec l'introduction de UIApplicationOpenSettingsURLString, utilisé pour charger l'application Paramètres via -openURL:. La valeur n'existait pas avant iOS 8. Le passage de zéro à cette API se bloquera, vous devez donc prendre soin de vérifier d'abord l'existence de la constante:
if (&UIApplicationOpenSettingsURLString != NULL) {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
}
Comparé à la version du système d'exploitation:
Supposons que vous soyez confronté au besoin relativement rare de vérifier la version du système d'exploitation. Pour les projets ciblant iOS 8 et NSProcessInfoversions ultérieures , inclut une méthode pour effectuer des comparaisons de versions avec moins de risques d'erreur:
- (BOOL)isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion)version
Les projets ciblant les systèmes plus anciens peuvent utiliser systemVersionsur UIDevice. Apple l'utilise dans leur exemple de code 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, pour une raison quelconque, vous décidez que systemVersionc'est ce que vous voulez, assurez-vous de le traiter comme une chaîne ou vous risquez de tronquer le numéro de révision du correctif (par exemple, 3.1.2 -> 3.1).