web-dev-qa-db-fra.com

Comment pouvons-nous détecter par programme sur quelle version iOS le périphérique est exécuté?

Je veux vérifier si l'utilisateur exécute l'application sur iOS moins de 5.0 et afficher une étiquette dans l'application.

Comment détecter par programme quel iOS s'exécute sur le périphérique de l'utilisateur?

Merci!

285
meetpd

Meilleure version actuelle , sans avoir à traiter de recherche numérique dans NSString, c'est définir macros (Voir la réponse d'origine: Check iPhone Version iOS )

Ces macros existent dans github, voir: https://github.com/carlj/CJAMacros/blob/master/CJAMacros/CJAMacros.h

Comme ça:

#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)

et les utiliser comme ceci:

if (SYSTEM_VERSION_LESS_THAN(@"5.0")) {
    // code here
}

if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"6.0")) {
    // code here
}

Version obsolète ci-dessous

pour obtenir la version du système d'exploitation:

[[UIDevice currentDevice] systemVersion]

renvoie la chaîne, qui peut être transformée en int/float via

-[NSString floatValue]
-[NSString intValue]

comme ça

Les deux valeurs (floatValue, intValue) seront supprimées en raison de son type, la version 5.0.1 deviendra 5.0 ou 5 (float ou int). Pour comparer avec précision, vous devrez la séparer en un tableau de réponses acceptées par le contrôle INT ici: - Vérifier la version iPhone iOS

NSString *ver = [[UIDevice currentDevice] systemVersion];
int ver_int = [ver intValue];
float ver_float = [ver floatValue];

et comparer comme ça

NSLog(@"System Version is %@",[[UIDevice currentDevice] systemVersion]);
NSString *ver = [[UIDevice currentDevice] systemVersion];
float ver_float = [ver floatValue];
if (ver_float < 5.0) return false;

Pour la syntaxe Swift 4.0

l'exemple ci-dessous vérifie simplement si le périphérique est de version iOS11 ou supérieure.

let systemVersion = UIDevice.current.systemVersion
if systemVersion.cgFloatValue >= 11.0 {
    //"for ios 11"
  }
else{
   //"ios below 11")
  }
672
Marek Sebera

Mise à jour

Depuis iOS 8, nous pouvons utiliser la nouvelle méthode isOperatingSystemAtLeastVersion sur NSProcessInfo

   NSOperatingSystemVersion ios8_0_1 = (NSOperatingSystemVersion){8, 0, 1};
   if ([[NSProcessInfo processInfo] isOperatingSystemAtLeastVersion:ios8_0_1]) {
      // iOS 8.0.1 and above logic
   } else {
      // iOS 8.0.0 and below logic
   }

Attention, cela va planter sur iOS 7, car l'API n'existait pas avant iOS 8. Si vous utilisez iOS 7 ou une version antérieure, vous pouvez effectuer le contrôle en toute sécurité avec

if ([NSProcessInfo instancesRespondToSelector:@selector(isOperatingSystemAtLeastVersion:)]) {
  // conditionally check for any version >= iOS 8 using 'isOperatingSystemAtLeastVersion'
} else {
  // we're on iOS 7 or below
}

Réponse originale iOS <8

Par souci d'exhaustivité, voici une approche alternative proposée par Apple lui-même dans le iOS 7 Guide de transition de l'interface utilisateur , qui consiste à vérifier la version de Foundation Framework.

if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1) {
   // Load resources for iOS 6.1 or earlier
} else {
   // Load resources for iOS 7 or later
}
257
Gabriele Petronella

Je sais que je suis trop tard pour répondre à cette question. Je ne suis pas sûr que ma méthode fonctionne toujours sur les versions iOS faibles (<5.0):

NSString *platform = [UIDevice currentDevice].model;

NSLog(@"[UIDevice currentDevice].model: %@",platform);
NSLog(@"[UIDevice currentDevice].description: %@",[UIDevice currentDevice].description);
NSLog(@"[UIDevice currentDevice].localizedModel: %@",[UIDevice currentDevice].localizedModel);
NSLog(@"[UIDevice currentDevice].name: %@",[UIDevice currentDevice].name);
NSLog(@"[UIDevice currentDevice].systemVersion: %@",[UIDevice currentDevice].systemVersion);
NSLog(@"[UIDevice currentDevice].systemName: %@",[UIDevice currentDevice].systemName);

Vous pouvez obtenir ces résultats:

[UIDevice currentDevice].model: iPhone
[UIDevice currentDevice].description: <UIDevice: 0x1cd75c70>
[UIDevice currentDevice].localizedModel: iPhone
[UIDevice currentDevice].name: Someones-iPhone002
[UIDevice currentDevice].systemVersion: 6.1.3
[UIDevice currentDevice].systemName: iPhone OS
22
Yi Jiang
[[UIDevice currentDevice] systemVersion]
15
jbat100

[[UIDevice currentDevice] systemVersion];

ou vérifiez la version comme

Vous pouvez obtenir les macros ci-dessous de ici .

if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(IOS_VERSION_3_2_0))      
{

        UIImageView *background = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"cs_lines_back.png"]] autorelease];
        theTableView.backgroundView = background;

}

J'espère que cela t'aides

14
Arunjack
[[[UIDevice currentDevice] systemVersion] floatValue]
9
Bhavesh Nayi

Marek Sebera est génial la plupart du temps, mais si vous êtes comme moi et trouvez que vous devez vérifier la version iOS plus souvent, vous ne souhaitez pas exécuter en permanence une macro en mémoire, car vous subirez un très léger ralentissement, en particulier sur les appareils plus anciens.

Au lieu de cela, vous souhaitez calculer la version iOS comme une seule fois et la stocker quelque part. Dans mon cas, j’utilise la classe singleton GlobalVariables que j’utilise pour vérifier la version iOS dans mon code à l’aide d’un code comme celui-ci:

if ([GlobalVariables sharedVariables].iOSVersion >= 6.0f) {
    // do something if iOS is 6.0 or greater
}

Pour activer cette fonctionnalité dans votre application, utilisez ce code (pour iOS 5+ utilisant ARC):

GlobalVariables.h:

@interface GlobalVariables : NSObject

@property (nonatomic) CGFloat iOSVersion;

    + (GlobalVariables *)sharedVariables;

@end

GlobalVariables.m:

@implementation GlobalVariables

@synthesize iOSVersion;

+ (GlobalVariables *)sharedVariables {
    // set up the global variables as a static object
    static GlobalVariables *globalVariables = nil;
    // check if global variables exist
    if (globalVariables == nil) {
        // if no, create the global variables class
        globalVariables = [[GlobalVariables alloc] init];
        // get system version
        NSString *systemVersion = [[UIDevice currentDevice] systemVersion];
        // separate system version by periods
        NSArray *systemVersionComponents = [systemVersion componentsSeparatedByString:@"."];
        // set ios version
        globalVariables.iOSVersion = [[NSString stringWithFormat:@"%01d.%02d%02d", \
                                       systemVersionComponents.count < 1 ? 0 : \
                                       [[systemVersionComponents objectAtIndex:0] integerValue], \
                                       systemVersionComponents.count < 2 ? 0 : \
                                       [[systemVersionComponents objectAtIndex:1] integerValue], \
                                       systemVersionComponents.count < 3 ? 0 : \
                                       [[systemVersionComponents objectAtIndex:2] integerValue] \
                                       ] floatValue];
    }
    // return singleton instance
    return globalVariables;
}

@end

Vous pouvez maintenant vérifier facilement la version iOS sans exécuter de macros en permanence. Notez en particulier comment j'ai converti le [[UIDevice currentDevice] systemVersion] NSString en un CGFloat accessible en permanence sans utiliser aucune des méthodes inappropriées déjà mentionnées sur cette page. Mon approche suppose que la chaîne de la version est au format n.nn.nn (permettant l’absence de bits ultérieurs) et fonctionne pour iOS5 +. Lors des tests, cette approche est beaucoup plus rapide que l’exécution constante de la macro.

J'espère que cela aide les personnes confrontées au problème que j'ai rencontré!

5
Anton

Pour obtenir des informations plus spécifiques sur le numéro de version avec les versions majeure et mineure séparées:

NSString* versionString = [UIDevice currentDevice].systemVersion;
NSArray* vN = [versionString componentsSeparatedByString:@"."];

Le tableau vN contiendra les versions majeure et mineure sous forme de chaînes, mais si vous souhaitez effectuer des comparaisons, les numéros de version doivent être stockés sous forme de nombres (ints). Vous pouvez ajouter ce code pour les stocker dans le tableau C * versionNumbers:

int versionNumbers[vN.count];
for (int i = 0; i < sizeof(versionNumbers)/sizeof(versionNumbers[0]); i++)
    versionNumbers[i] = [[vN objectAtIndex:i] integerValue];

* Les tableaux C sont utilisés ici pour une syntaxe plus concise.

2
JohnK

Dans MonoTouch:

Pour obtenir la version majeure, utilisez:

UIDevice.CurrentDevice.SystemVersion.Split('.')[0]

Pour les versions mineures, utilisez:

UIDevice.CurrentDevice.SystemVersion.Split('.')[1]
1
callisto

Une vérification simple pour la version iOS inférieure à 5 (toutes les versions):

if([[[UIDevice currentDevice] systemVersion] integerValue] < 5){
        // do something
};
0
iCode