850 votes

Comment vérifier la version iOS?

Je veux vérifier si l' iOS version de l'appareil est plus grand que 3.1.3 J'ai essayé des choses comme:

[[UIDevice currentDevice].systemVersion floatValue]

mais il ne fonctionne pas, je veux juste un:

if (version > 3.1.3) { }

Comment puis-je y parvenir?

1054voto

yasirmturk Points 935
/*
 *  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")) {
    ...
}

1004voto

Justin Points 9636

Vous pouvez obtenir la version du système d'exploitation à l'aide de:

[[UIDevice currentDevice] systemVersion]

Cependant, vous devriez éviter de compter sur la chaîne de version comme une indication de l'appareil ou fonctionnalités du système d'exploitation. Il est généralement une méthode plus fiable de vérifier si une caractéristique particulière ou de la classe est disponible. Par exemple, vous pouvez vérifier si UIPopoverController est disponible sur l'appareil à l'aide de NSClassFromString:

if(NSClassFromString(@"UIPopoverController")) {
    // Do something
}

Pour le peu de liens classes, il est sûr de message de la classe, directement. Notamment, cela fonctionne pour les cadres qui ne sont pas liés explicitement que "Nécessaire". Pour les classes manquantes, l'expression a la valeur nil, à défaut de la condition:

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
}

Apple utilise systemVersion dans leur GLSprite exemple de code, de sorte que ma recommandation ne peut pas être absolue:

// 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 quelque raison que ce soit vous décidez que systemVersion est ce que vous voulez, assurez-vous de le traiter comme une chaîne ou vous risquez de tronquer la mineure numéro de révision (p. ex. 3.1.2 -> 3.1). Comme d'iOS 8, NSProcessInfo inclut une méthode pour effectuer cette version des comparaisons avec moins de risques d'erreur:

- (BOOL)isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion)version

253voto

CarlJ Points 5080

Comme suggéré par l' officiel d'Apple docs: vous pouvez utiliser l' NSFoundationVersionNumber, à partir de l' NSObjCRuntime.h fichier d'en-tête.

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

37voto

Jonathan Grynspan Points 32291

Essayez:

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
}

35voto

Daniel Galasko Points 485

Nouveau dans iOS 8 est - NSProcessInfo qui intègre fortement avec Swift et permet une meilleure sémantique gestion des versions des contrôles. Grâce à NSHipster nous pouvons voir un propre et canonique de la source d'où la version de l'OS peut être dérivée.

Pour un minimum de cibles de déploiement d' iOS 8.0 ou supérieur, utilisez NSProcessInfo operatingSystemVersion ou isOperatingSystemAtLeastVersion.

Cela permettrait de produire les résultats suivants:

let minimumVersion = NSOperatingSystemVersion(majorVersion: 3, minorVersion: 1, patchVersion: 3)
if NSProcessInfo().isOperatingSystemAtLeastVersion(minimumVersion) {
    //do some fun stuff
}

Pour un minimum de cibles de déploiement d' iOS 7.1 ou ci-dessous, utilisez les comparer avec NSStringCompareOptions.NumericSearch sur UIDevice systemVersion.

Cela donnerait:

let minimumVersionString = "3.1.3"
let versionComparison: NSComparisonResult = UIDevice.currentDevice().systemVersion.compare(minimumVersionString, options: NSStringCompareOptions.NumericSearch)
if  versionComparison == .OrderedDescending {
    //do some fun stuff
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X