La réponse rapide…
Depuis Swift 2.0, vous pouvez utiliser #available
dans un if
ou guard
pour 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 UIPopoverController
est 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 CLLocationManager
et 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 NSProcessInfo
versions 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 systemVersion
sur 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 systemVersion
c'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).