Comment Pouvons-nous détecter programmatically quelle version de Ios est le périphérique en cours d'exécution? [dupliquer]

cette question a déjà une réponse ici:

je veux vérifier si l'utilisateur exécute l'application sur iOS moins de 5,0 et l'affichage d'une étiquette dans l'application.

Comment puis-je détecter quel iOS est en cours d'exécution sur l'appareil de l'utilisateur par programmation?

Merci!

281
demandé sur meetpd 2011-10-21 15:30:06

10 réponses

meilleure version actuelle , sans besoin de traiter la recherche numérique dans NSString est de définir macros (voir la réponse originale: vérifier la version iPhone iOS )

ces macros existent en github, voir: https://github.com/carlj/CJAMacros/blob/master/CJAMacros/CJAMacros.h

comme ceci:

#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 périmée ci-dessous

pour obtenir la version OS:

[[UIDevice currentDevice] systemVersion]

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

-[NSString floatValue]
-[NSString intValue]

comme ceci

les deux valeurs (floatValue, intValue) seront dépouillées en raison de son type, 5.0.1 deviendra 5.0 ou 5 (float ou int), pour comparer précisément, vous devrez séparer à un tableau d'Entiers vérifier accepté de répondre ici: Case iPhone iOS Version

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

et comparez comme ceci

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 ne fait que vérifier si l'appareil est de la version iOS11 ou plus.

let systemVersion = UIDevice.current.systemVersion
if systemVersion.cgFloatValue >= 11.0 {
    //"for ios 11"
  }
else{
   //"ios below 11")
  }
664
répondu Marek Sebera 2018-03-06 13:24:08

mise à Jour

De l'iOS 8, nous pouvons utiliser la nouvelle isOperatingSystemAtLeastVersion méthode 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 se planter sur iOS 7, car L'API n'existait pas avant iOS 8. Si vous supportez iOS 7 et inférieur, 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
}

"151950920 Original de la réponse iOS < 8

Par souci d'exhaustivité, voici une autre approche proposé par Apple lui-même dans le iOS 7 UI Transition Guide , qui implique de vérifier la version du cadre de base.

if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1) {
   // Load resources for iOS 6.1 or earlier
} else {
   // Load resources for iOS 7 or later
}
254
répondu Gabriele Petronella 2014-11-05 06:25:25

je sais que je suis en retard pour répondre à cette question. Je ne suis pas sûr que ma méthode fonctionne encore sur les versions basses de iOS (< 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
répondu Yi Jiang 2013-11-14 07:05:13
[[UIDevice currentDevice] systemVersion]
14
répondu jbat100 2011-10-21 11:32:16

[[UIDevice currentDevice] systemVersion];

ou vérifier 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;

}

Espérons que cette aide

14
répondu Arunjack 2017-05-23 11:54:47
[[[UIDevice currentDevice] systemVersion] floatValue]
9
répondu Bhavesh Nayi 2013-05-22 06:58:40

Marek Sebera est génial la plupart du temps, mais si vous êtes comme moi et que vous devez vérifier la version iOS fréquemment, vous ne voulez pas constamment exécuter une macro en mémoire parce que vous allez éprouver un très léger ralentissement, surtout sur les appareils plus anciens.

au lieu de cela, vous voulez calculer la version iOS comme un flotteur une fois et le stocker quelque part. Dans mon cas, j'ai une classe GlobalVariables singleton que j'utilise pour vérifier la version iOS dans mon code en utilisant le code comme ceci:

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+ en 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

Maintenant vous pouvez facilement vérifier la version iOS sans exécuter des macros en permanence. Remarque en particulier la façon dont j'ai converti le [[UIDevice currentDevice] systemVersion] NSString à un CGFloat qui est constamment accessible sans utiliser aucune des méthodes inappropriées beaucoup ont déjà signalé sur cette page. Mon approche suppose que la chaîne de version est dans le format N. nn.nn (permettant aux bits postérieurs d'être manquants) et fonctionne pour iOS5+. Dans testing, cette approche est beaucoup plus rapide que l'exécution constante de la macro.

Espérons que cela aide quelqu'un rencontre le problème que j'ai eu!

5
répondu Anton 2013-03-06 22:33:18

pour obtenir des informations plus spécifiques sur le numéro de version avec les versions majeures et mineures séparées:

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

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

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

* C-tableaux utilisés ici pour la syntaxe plus concise.

2
répondu JohnK 2013-10-03 19:10:49

En MonoTouch:

pour obtenir la version principale utiliser:

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

Pour la version mineure:

UIDevice.CurrentDevice.SystemVersion.Split('.')[1]
1
répondu callisto 2012-11-16 08:41:55

Une façon simple de vérifier pour la version iOS de moins de 5 (toutes les versions):

if([[[UIDevice currentDevice] systemVersion] integerValue] < 5){
        // do something
};
0
répondu iCode 2012-08-14 14:22:23