La réponse rapide
À partir de Swift 2.0, vous pouvez utiliser #available
dans un if
o guard
pour protéger le code qui ne doit être exécuté que sur certains systèmes.
if #available(iOS 9, *) {}
En Objective-C, vous devez vérifier la version du système et effectuer une comparaison.
[[NSProcessInfo processInfo] operatingSystemVersion]
dans iOS 8 et plus.
A partir de Xcode 9 :
if (@available(iOS 9, *)) {}
La réponse complète
En Objective-C, et en Swift dans de rares cas, il vaut mieux éviter de se fier à la version du système d'exploitation comme indication des capacités du périphérique ou du système d'exploitation. Il existe généralement une méthode plus fiable pour vérifier si une fonctionnalité ou une classe particulière est disponible.
Vérification de la présence d'API :
Par exemple, vous pouvez vérifier si UIPopoverController
est disponible sur l'appareil actuel en utilisant NSClassFromString
:
if (NSClassFromString(@"UIPopoverController")) {
// Do something
}
Pour les classes faiblement liées, il est prudent d'envoyer un message à la classe, directement. Notamment, cela fonctionne pour les frameworks qui ne sont pas explicitement liés comme "Required". Pour les classes manquantes, l'expression est évaluée à nil, ce qui fait échouer la condition :
if ([LAContext class]) {
// Do something
}
Certaines classes, comme CLLocationManager
y UIDevice
, fournissent des méthodes pour vérifier les capacités des dispositifs :
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. Ceci est apparu dans iOS 8 avec l'introduction de la fonction UIApplicationOpenSettingsURLString
utilisé pour charger l'application Settings via -openURL:
. Cette valeur n'existait pas avant iOS 8. Passer nil à cette API provoquera un plantage, vous devez donc prendre soin de vérifier d'abord l'existence de la constante :
if (&UIApplicationOpenSettingsURLString != NULL) {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
}
Comparaison avec 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 visant iOS 8 et plus, NSProcessInfo
comprend une méthode permettant d'effectuer des comparaisons de versions avec moins de risques d'erreur :
- (BOOL)isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion)version
Les projets visant des systèmes plus anciens peuvent utiliser systemVersion
sur UIDevice
. Apple l'utilise dans son GLSprite exemple de code.
// 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
est ce que vous voulez, assurez-vous de le traiter comme une chaîne de caractères ou vous risquez de tronquer le numéro de révision du patch (ex. 3.1.2 -> 3.1).
7 votes
Note du modérateur : Au fil du temps, cette question a accumulé plus de 30 réponses. Avant d'ajouter une nouvelle réponse, soyez sûr que votre solution n'a pas déjà été fournie.
5 votes
Démarrer Xcode 7,
if #available(iOS 9, *) {}
dans Swift. Démarrer Xcode 9,if (@available(iOS 11, *)) {}
en objective-c.0 votes
Vérifiez ceci github.com/aleemrazzaq/ARCompactDeviceInfo