Je veux vérifier si la iOS
version de l'appareil est supérieure à 3.1.3
ce que j'ai essayé des choses comme:
[[UIDevice currentDevice].systemVersion floatValue]
mais ça ne marche pas, je veux juste un:
if (version > 3.1.3) { }
Comment puis-je atteindre cet objectif?
ios
objective-c
John
la source
la source
if #available(iOS 9, *) {}
dans Swift. Démarrage de Xcode 9,if (@available(iOS 11, *)) {}
dans objective-c.Réponses:
La réponse rapide…
Depuis Swift 2.0, vous pouvez utiliser
#available
dans unif
ouguard
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 utilisantNSClassFromString
: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:
Certaines classes, comme
CLLocationManager
etUIDevice
, fournissent des méthodes pour vérifier les capacités des périphériques: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: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:Les projets ciblant les systèmes plus anciens peuvent utiliser
systemVersion
surUIDevice
. Apple l'utilise dans leur exemple de code GLSprite .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).la source
-viewWillAppear
unUISplitViewController
. Mon hack est de déterminer si <iOS 4.0 et de l'envoyer moi-même au contrôleur de vue détaillée dans la vue racine-didSelectRowAtIndexPath
.[@"10.0" compare:@"10" options:NSNumericSearch]
retoursNSOrderedDescending
, qui pourraient bien ne pas être destinés du tout. (Je pourrais m'attendreNSOrderedSame
.) C'est au moins une possibilité théorique.respondsToSelector
et al ne feraient pas le travail - doivent comparer les versions.NSFoundationVersionNumber
et uniquement si cela n'est pas possible, vous devez vérifier les versions du systèmeUIDevice
.la source
.0
numéros facultatifs . Par exemple,SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0.0")
donne un résultat incorrect sur iOS 7.0.Comme suggéré par les documents officiels d'Apple : vous pouvez utiliser le
NSFoundationVersionNumber
, à partir duNSObjCRuntime.h
fichier d'en-tête.la source
NSFoundationVersionNumber_iOS_6_1
n'existe pas dans le SDK iOS 5.#ifndef NSFoundationVersionNumber_iOS_7_0 #define NSFoundationVersionNumber_iOS_7_0 1047.00 #endif
. Pour éviter de gâcher comme ça, je suis allé avec la macro SYSTEM_VERSION_LESS_THAN (v) de yasirmturkNSFoundationVersionNumber_iOS_8_0
dans iOS 9. il suffit de vérifierNSFoundationVersionNumber > NSFoundationVersionNumber_iOS_7_1
Démarrage de Xcode 9, dans Objective-C :
Démarrage de Xcode 7, dans Swift :
Pour la version, vous pouvez spécifier le MAJOR, le MINOR ou le PATCH (voir http://semver.org/ pour les définitions). Exemples:
iOS 11
etiOS 11.0
sont la même version minimaleiOS 10
,iOS 10.3
,iOS 10.3.1
Sont différentes versions minimalesVous pouvez saisir des valeurs pour n'importe lequel de ces systèmes:
iOS
,macOS
,watchOS
,tvOS
Exemple de cas réel tiré de l' un de mes pods :
Documentation
la source
if (...) {} else { ... }
guard
dans Objective-C au lieu de laisser le bloc ouvert et le retrait dans l'else
instruction?if
bloc vide suivi d'unelse
.if
blocs vides .Ceci est utilisé pour vérifier la version compatible du SDK dans Xcode, c'est si vous avez une grande équipe avec différentes versions de Xcode ou plusieurs projets prenant en charge différents SDK qui partagent le même code:
Ce que vous voulez vraiment, c'est vérifier la version iOS sur l'appareil. Vous pouvez le faire avec ceci:
Version Swift:
Les versions actuelles de swift devraient utiliser ceci:
la source
Essayer:
la source
Approche préférée
Dans Swift 2.0, Apple a ajouté la vérification de la disponibilité en utilisant une syntaxe beaucoup plus pratique (en savoir plus ici ). Vous pouvez maintenant vérifier la version du système d'exploitation avec une syntaxe plus propre:
Ceci est préférable à la vérification,
respondsToSelector
etc. ( Quoi de neuf dans Swift ). Maintenant, le compilateur vous avertira toujours si vous ne protégez pas correctement votre code.Pre Swift 2.0
La nouveauté d'iOS 8
NSProcessInfo
permet de meilleurs contrôles de version sémantique.Déploiement sur iOS 8 et supérieur
Cela donnerait les résultats suivants:
Déploiement sur iOS 7
Cela donnerait:
Plus de lecture sur NSHipster .
la source
Je garde toujours ceux-ci dans mon fichier Constants.h:
la source
.pch
fichier de votre projet XCodeConstants.h
fichier qui est importé dans monpch
fichier.la source
Avec la classe Version qui est contenue dans le projet nv-ios-version (licence Apache, version 2.0), il est facile d'obtenir et de comparer la version iOS. Un exemple de code ci-dessous vide la version iOS et vérifie si la version est supérieure ou égale à 6.0.
Page du projet: nv-ios-version
TakahikoKawasaki / nv-ios-version
Blog: obtenir et comparer la version iOS à l'exécution avec la classe Version
Obtenir et comparer la version iOS à l'exécution avec la classe Version
la source
Nouvelle façon de vérifier la version du système à l'aide de swift Forget [[UIDevice currentDevice] systemVersion] et NSFoundationVersionNumber.
Nous pouvons utiliser NSProcessInfo -isOperatingSystemAtLeastVersion
la source
UIDevice + IOSVersion.h
UIDevice + IOSVersion.m
la source
En général, il vaut mieux demander si un objet peut exécuter un sélecteur donné, plutôt que de vérifier un numéro de version pour décider s'il doit être présent.
Lorsque ce n'est pas une option, vous devez être un peu prudent ici car des
[@"5.0" compare:@"5" options:NSNumericSearch]
retoursNSOrderedDescending
qui pourraient bien ne pas être du tout destinés; Je pourrais m'attendreNSOrderedSame
ici. C'est au moins une préoccupation théorique, qui mérite d'être défendue à mon avis.Il convient également de considérer la possibilité d'une entrée de mauvaise version qui ne peut pas être raisonnablement comparée. Apple fournit les trois constantes prédéfinies
NSOrderedAscending
,NSOrderedSame
etNSOrderedDescending
mais je ne peux penser à une utilisation pour quelque chose appeléNSOrderedUnordered
en cas je ne peux pas comparer deux choses et je veux retourner une valeur indiquant cela.De plus, il n'est pas impossible qu'Apple élargisse un jour leurs trois constantes prédéfinies pour permettre une variété de valeurs de retour, ce qui rend la comparaison
!= NSOrderedAscending
imprudente.Cela dit, considérez le code suivant.
la source
Où bien sûr,
NSFoundationVersionNumber_iOS_6_1
doit être remplacé par par applicable à la version iOS que vous souhaitez vérifier. Ce que j'ai maintenant écrit sera probablement beaucoup utilisé lors du test si un appareil exécute iOS7 ou une version précédente.la source
un peu tard pour la fête, mais à la lumière d'iOS 8.0, cela pourrait être pertinent:
si vous pouvez éviter d'utiliser
[[UIDevice currentDevice] systemVersion]
Vérifiez plutôt l'existence d'une méthode / classe / quoi que ce soit d'autre.
Je l'ai trouvé utile pour le gestionnaire d'emplacement où je dois appeler requestWhenInUseAuthorization pour iOS 8.0 mais la méthode n'est pas disponible pour iOS <8
la source
la source
Je sais que c'est une vieille question, mais quelqu'un aurait dû mentionner les macros de compilation dans
Availability.h
. Toutes les autres méthodes ici sont des solutions d'exécution et ne fonctionneront pas dans un fichier d'en-tête, une catégorie de classe ou une définition ivar.Pour ces situations, utilisez
h / t cette réponse
la source
Ajoutez ensuite une condition if comme suit: -
la source
Il existe des versions comme 7.0 ou 6.0.3, nous pouvons donc simplement convertir la version en chiffres à comparer. si la version est comme 7.0, ajoutez-y simplement un autre ".0" puis prenez sa valeur numérique.
Pour 6.0.0
pour 7.0
la source
6.1.10
. alors cet algorithme donnera6110 > 700
, ce qui n'est pas correct.Essayez le code ci-dessous:
la source
Juste pour récupérer la valeur de la chaîne de version du système d'exploitation:
la source
En tant que variante de la solution yasimturks, j'ai défini une fonction et quelques valeurs d'énumération au lieu de cinq macros. Je le trouve plus élégant, mais c'est une question de goût.
Usage:
Fichier .h:
Fichier .m:
Vous devez ajouter le préfixe de votre application aux noms, en particulier au
Comparison
type.la source
En utilisant la méthode recommandée référencée ... s'il n'y a pas de définition dans les fichiers d'en-tête, vous pouvez toujours obtenir la version imprimée sur la console avec un périphérique de la version IOS souhaitée.
la source
Solution pour vérifier la version iOS dans Swift
Inconvénient de cette solution: il est tout simplement mauvais de vérifier les numéros de version du système d'exploitation, quelle que soit la façon dont vous le faites. Il ne faut jamais durer les dépendances de code de cette manière, toujours vérifier les fonctionnalités, les capacités ou l'existence d'une classe. Considère ceci; Apple peut publier une version rétrocompatible d'une classe, si c'est le cas, le code que vous proposez ne l'utilisera jamais car votre logique recherche un numéro de version du système d'exploitation et NON l'existence de la classe.
( Source de cette information )
Solution pour vérifier l'existence de classe dans Swift
Ne l'utilisez pas
if (NSClassFromString("UIAlertController") == nil)
car il fonctionne correctement sur le simulateur iOS utilisant iOS 7.1 et 8.2, mais si vous testez sur un appareil réel utilisant iOS 7.1, vous remarquerez malheureusement que vous ne passerez jamais par le reste de l'extrait de code.la source
la source
Une version plus générique dans Obj-C ++ 11 (vous pourriez probablement remplacer certaines de ces choses par les fonctions NSString / C, mais c'est moins détaillé. Cela vous donne deux mécanismes. SplitSystemVersion vous donne un tableau de toutes les parties qui est utile si vous voulez simplement activer la version principale (par exemple
switch([self splitSystemVersion][0]) {case 4: break; case 5: break; }
).la source
Essaye ça
la source
la source
float versionToBeCompared = 3.1.3;
ne peut même pas compiler.Exemple rapide qui fonctionne réellement:
N'utilisez pas NSProcessInfo car il ne fonctionne pas sous 8.0, donc c'est à peu près inutile jusqu'en 2016
la source
Voici une version rapide:
Usage:
la source
struct iOSVersion { static let SYS_VERSION_FLOAT = (UIDevice.currentDevice().systemVersion as NSString).floatValue static let iOS7 = (iOSVersion.SYS_VERSION_FLOAT < 8.0 && iOSVersion.SYS_VERSION_FLOAT >= 7.0) static let iOS8 = (iOSVersion.SYS_VERSION_FLOAT >= 8.0 && iOSVersion.SYS_VERSION_FLOAT < 9.0) static let iOS9 = (iOSVersion.SYS_VERSION_FLOAT >= 9.0 && iOSVersion.SYS_VERSION_FLOAT < 10.0) }