2010-11-18 7 views
15

Possible en double:
Check iPhone iOS VersionComment détecter iOS actuel est 4.1 ou 4.2?

J'ai essayé avec ce code:

#if (__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_2_2) 
    NSLog(@"iPhone 4.2"); 
#endif 

mais quand je le lance à nouveau sur simulateur 4.1, je reçois toujours le journal « iPhone 4.2 "dans la console.

Merci de votre aide.

Tung Do

+7

Les deux 4.1 et 4.2 sont ≥ 2,2. – kennytm

+5

# if/# endif sont des directives * compile-time *. Tout ce qu'ils font est comparer avec vos paramètres de construction pour voir quelle version du système d'exploitation que vous ciblez. Mais le même code sera généré quel que soit le système d'exploitation utilisé. Vous voulez un contrôle * run-time *. – benzado

+0

Essayez celui-ci: http://jayprakashdubey.blogspot.in/2014/07/check-device-os-version.html –

Répondre

27

Vous devriez probablement éviter de demander au sujet de la version du système tout à fait.

Une meilleure conception poserait une question sur une caractéristique spécifique. Par exemple: if (NSClassFromString(@"UIPrintInfo")) vous indiquerait si le périphérique actuel prend en charge l'API d'impression, disponible en version 4.2 ou ultérieure. De cette façon, vous pouvez planifier votre code pour utiliser une fonctionnalité si elle est disponible, et non basée sur la version du système d'exploitation.

+0

Merci. Ce code fonctionne parfaitement. –

21
float version = [[[UIDevice currentDevice] systemVersion] floatValue]; 
+0

Merci. Ce code fonctionne comme prévu mais je pense que la solution de Zigfried est plus flexible. –

+0

vérifier ce post il a une bonne réponse http://www.techpaa.com/2012/11/best-way-checking-iphone-ios-version.html – ShivaPrasad

3

Règle 1: Ne dépendez pas de la version ou du type de périphérique pour déterminer si une fonction est disponible. Différents appareils (iPhone, iPod Touch et iPad) peuvent obtenir la même fonctionnalité mais à différentes versions de l'OS. Lien faible par rapport aux cadres et classes manquantes sera nil. Ou utilisez la fonction NSClassFromString() qui renvoie également nil si une classe n'existe pas. Utilisez également -[NSObject respondsToSelector:] pour rechercher si une méthode existe ou non.

Règle 2: Apple déconseille d'utiliser les constantes définies (comme __IPHONE_2_2) lors de la vérification des versions, utilisez plutôt leurs valeurs numériques en tant que tel:

#if (__IPHONE_OS_VERSION_MAX_ALLOWED >= 40200) 
    NSLog(@"BUILT against iPhone 4.2 or later"); 
#endif 

Mais ne prenez avis à l'aide #if compilation directive ne vérifiera que la version du SDK vous construire contre pas quelle version du système d'exploitation sera plus tard fonctionner sur.

+0

ce code sera exécuté même dans iPhone 4.0 et 4.1 –

5

Vous pouvez le faire soit au moment de la compilation ou à l'exécution.

Pour compilation, vous utilisez les soi-disant macros Disponibilité:

#if __IPHONE_OS_VERSION_MAX_ALLOWED > 40000 // __IPHONE_4_0 
    NSLog(@"After Version 4.0"); 
#else 
    NSLog(@"Version 4.0 or earlier"); 
#endif 

Cependant, le problème avec la compilation est que vous devez maintenir plusieurs binaires. Si vous voulez que ce binaire s'exécute sur pré-4.x, alors vous devriez avoir un lien faible vers les bibliothèques iOS.

if(kCFCoreFoundationVersionNumber > kCFCoreFoundationVersionNumber_iPhoneOS_4_0) 
{ 
    NSLog(@"After Version 4.0"); 
} 
else 
{ 
    NSLog(@"Version 4.0 or earlier"); 
} 

Il y a un bon tutoriel ici: http://cocoawithlove.com/2010/07/tips-tricks-for-conditional-ios3-ios32.html

+0

oui, mais je veux détecter l'iPhone 4.2 avec l'autre. –

6

Ou, mieux encore:

CGFloat systemVersion = [[[ UIDevice currentDevice ] systemVersion ] floatValue ];

Ensuite, vous pouvez effectuer une vérification d'égalité simple, par ex.

if(systemVersion > 4.1){...}

Questions connexes