Как определить текущий iOS 4.1 или 4.2?

Возможный дубликат:
Проверить версию iPhone iOS

Я пробовал с этим кодом:

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

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

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

Тунг До

Ответы

Ответ 1

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

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

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

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

Ответ 2

float version = [[[UIDevice currentDevice] systemVersion] floatValue]; 

Ответ 3

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

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

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

if( systemVersion > 4.1 ){...}

Ответ 4

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

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

#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

Ответ 5

Правило 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 директивы compile-time будет только проверять, какая версия SDK вы создаете против, а какая версия ОС будет позже работать на.