Question Comment vérifier la version iOS?


Je veux vérifier si le iOS la version de l'appareil est supérieure à 3.1.3 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?


772
2017-07-26 23:30


origine


Réponses:


La réponse rapide ...


À partir de Swift 2.0, vous pouvez utiliser #available dans un if ou guard pour protéger le code qui ne devrait ê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 au-dessus.

À partir de 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 de ne pas se fier à la version du système d'exploitation pour indiquer les 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 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 possible d'envoyer un message directement à la classe. Notamment, cela fonctionne pour les frameworks qui ne sont pas explicitement liés comme "Required". Pour les classes manquantes, l'expression est nulle, à défaut de la condition suivante:

if ([LAContext class]) {
    // Do something
}

Certaines classes, comme CLLocationManager et UIDevice, fournir des méthodes pour vérifier les capacités du périphérique:

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 nul à cette API va planter, vous devez donc vérifier l'existence de la constante en premier:

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 ciblant iOS 8 et supérieur, NSProcessInfo inclut une méthode pour effectuer des comparaisons de versions avec moins de chance d'erreur:

- (BOOL)isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion)version

Les projets ciblant les anciens systèmes peuvent utiliser systemVersion sur UIDevice. Apple l'utilise dans leur 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 ou vous risquez de tronquer le numéro de révision du patch (par exemple 3.1.2 -> 3.1).


906
2017-07-26 23:44



/*
 *  System Versioning Preprocessor Macros
 */ 

#define SYSTEM_VERSION_EQUAL_TO(v)                  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedSame)
#define SYSTEM_VERSION_GREATER_THAN(v)              ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending)
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN(v)                 ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v)     ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedDescending)

/*
 *  Usage
 */ 

if (SYSTEM_VERSION_LESS_THAN(@"4.0")) {
    ...
}

if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"3.1.1")) {
    ...
}

1039
2017-08-06 09:39



Comme suggéré par le Docs Apple officiels: vous pouvez utiliser le NSFoundationVersionNumber, du NSObjCRuntime.h En tête de fichier.

if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
    // here you go with iOS 7
}

245
2018-06-08 07:33



Démarrer Xcode 9, dans Objectif c:

if (@available(iOS 11, *)) {
    // iOS 11 (or newer) ObjC code
} else {
    // iOS 10 or older code
}

Démarrer Xcode 7, dans Rapide:

if #available(iOS 11, *) {
    // iOS 11 (or newer) Swift code
} else {
    // iOS 10 or older code
}

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 et iOS 11.0 sont la même version minimale
  • iOS 10, iOS 10.3, iOS 10.3.1 sont différentes versions minimales

Vous pouvez entrer des valeurs pour l'un de ces systèmes:

  • iOS, macOS, watchOS, tvOS

Exemple concret tiré de une de mes gousses:

if #available(iOS 10.0, tvOS 10.0, *) {
    // iOS 10+ and tvOS 10+ Swift code
} else {
    // iOS 9 and tvOS 9 older code
}

Documentation


63
2017-07-26 23:33



Essayer:

NSComparisonResult order = [[UIDevice currentDevice].systemVersion compare: @"3.1.3" options: NSNumericSearch];
if (order == NSOrderedSame || order == NSOrderedDescending) {
    // OS version >= 3.1.3
} else {
    // OS version < 3.1.3
}

36
2017-10-07 11:33



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 (Lire la suite ici). Maintenant, vous pouvez vérifier la version du système d'exploitation avec une syntaxe plus propre:

if #available(iOS 9, *) {
    // Then we are on iOS 9
} else {
    // iOS 8 or earlier
}

C'est le sur-contrôle préféré respondsToSelector etc (Quoi de neuf dans Swift). Maintenant, le compilateur vous avertira toujours si vous ne gardez pas votre code correctement.


Pré Swift 2.0

Nouveau dans iOS 8 est NSProcessInfo permettant de mieux vérifier les versions sémantiques.

Déploiement sur iOS 8 et supérieur

Pour les cibles de déploiement minimales de iOS 8.0 ou ci-dessus, utilisez NSProcessInfo operatingSystemVersion ou isOperatingSystemAtLeastVersion.

Cela donnerait ce qui suit:

let minimumVersion = NSOperatingSystemVersion(majorVersion: 8, minorVersion: 1, patchVersion: 2)
if NSProcessInfo().isOperatingSystemAtLeastVersion(minimumVersion) {
    //current version is >= (8.1.2)
} else {
    //current version is < (8.1.2)
}

Déploiement sur iOS 7

Pour les cibles de déploiement minimales de iOS 7.1 ou ci-dessous, utiliser comparer avec    NSStringCompareOptions.NumericSearch sur UIDevice systemVersion.

Cela donnerait:

let minimumVersionString = "3.1.3"
let versionComparison = UIDevice.currentDevice().systemVersion.compare(minimumVersionString, options: .NumericSearch)
switch versionComparison {
    case .OrderedSame, .OrderedDescending:
        //current version is >= (3.1.3)
        break
    case .OrderedAscending:
        //current version is < (3.1.3)
        fallthrough
    default:
        break;
}

Plus de lecture à NSHipster.


34
2017-09-18 21:58



Ceci est utilisé pour vérifier la version du SDK compatible dans Xcode, ceci est si vous avez une grande équipe avec différentes versions de Xcode ou plusieurs projets supportant différents SDK qui partagent le même code:

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000
  //programming in iOS 8+ SDK here
#else
  //programming in lower than iOS 8 here   
#endif

Ce que vous voulez vraiment, c'est vérifier la version iOS sur l'appareil. Vous pouvez le faire avec ceci:

if ([[[UIDevice currentDevice] systemVersion] floatValue] < 8.0) {
  //older than iOS 8 code here
} else {
  //iOS 8 specific code here
}

Version rapide:

if let version = Float(UIDevice.current.systemVersion), version < 9.3 {
    //add lower than 9.3 code here
} else {
    //add 9.3 and above code here
}

34
2017-07-27 06:32



Je recommande:

if ([[[UIDevice currentDevice] systemVersion] floatValue] > 3.13) {
    ; // ...
}

crédit: Comment cibler une version spécifique de l'iPhone?


19
2018-03-15 10:10