2010-11-18 2 views
15

Можно создать дубликат:
Check iPhone iOS VersionКак определить текущий iOS 4.1 или 4.2?

Я пытался с этим кодом:

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

, но когда я запускаю его снова на тренажере 4.1, я все еще получаю журнал «iPhone 4.2 "в консоли.

Спасибо, что помогли мне.

Tung Do

+7

И 4.1, и 4.2 являются ≥ 2.2. – kennytm

+5

# если/# endif are * время компиляции * директивы. Все, что они делают, сравнивается с вашими настройками сборки, чтобы увидеть, какую версию ОС вы нацеливаете. Но тот же код будет выводиться независимо от того, на какой ОС вы работаете. Вы хотите проверить * время выполнения. – benzado

+0

Попробуйте следующее: http://jayprakashdubey.blogspot.in/2014/07/check-device-os-version.html –

ответ

27

Вы, вероятно, следует избегать спрашивать о версии системы в целом.

Лучшая конструкция спросит об определенной функции.

Например: if (NSClassFromString(@"UIPrintInfo")) сообщит вам, поддерживает ли текущее устройство API печати, доступный в версии 4.2 или выше.

Таким образом, вы можете планировать свой код для использования функции, если она доступна, а не на основе версии ОС.

+0

Спасибо. Этот код работает отлично. –

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

Спасибо. Этот код работает так, как ожидалось, но я думаю, что решение Зигфрида более гибкое. –

+0

проверить это сообщение у него есть хороший ответ http://www.techpaa.com/2012/11/best-way-checking-iphone-ios-version.html – ShivaPrasad

3

Правило 1: Не зависит от версии или типа устройства, чтобы определить, доступна ли функция. Различные устройства (iPhone, iPod Touch и iPad) могут получать ту же функцию, но в разных версиях ОС. Ссылка слабо на рамки и отсутствующие классы будет nil. Или используйте NSClassFromString() функция, которая также возвращает nil, если класс не существует. Также используйте -[NSObject respondsToSelector:] для запроса, существует ли метод или нет.

Правило 2: Apple не рекомендует использовать определенные константы (например, __IPHONE_2_2) при проверке версий, вместо того, чтобы использовать их численные значения, как, например:

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

Но обратите внимание, используя #if время компиляции директива только проверит, какая версия SDK вы построить против не какая версия ОС будет позже работает на.

+0

этот код будет запущен даже в iPhone 4.0 и 4.1 –

5

Вы можете сделать это либо во время компиляции или во время выполнения.

Для компиляции, можно использовать так называемые макросы доступности:

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

Однако проблема компиляции является то, что вы должны поддерживать несколько двоичных файлов. Если вы хотите, чтобы этот двоичный файл выполнялся на pre-4.x, вам следует использовать слабую ссылку на библиотеки iOS.

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

Там хороший учебник здесь: http://cocoawithlove.com/2010/07/tips-tricks-for-conditional-ios3-ios32.html

+0

Да, но я хочу обнаружить iPhone 4.2 вместе с другим. –

6

Или еще лучше:

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

Затем вы можете выполнить простую проверку равенства, например.

if(systemVersion > 4.1){...}

Смежные вопросы