Как настроить таргетинг на определенную версию iPhone?

У меня есть код, который я хочу исполнить только на последнем iPhone SDK (3.0), однако я не могу понять, как можно ориентироваться только на 3.0 и игнорировать 2.2.1 и т.д. Существует инструкция ifdef, но похоже, что он охватывает весь iPhone:

#if TARGET_OS_IPHONE

Любая помощь приветствуется.

Ответ 1

Вы можете использовать это #define, чтобы изменить то, что вы создаете для каждого SDK...

#if __IPHONE_OS_VERSION_MIN_REQUIRED > __IPHONE_2_2
// iPhone 3.0 code here
#endif

И сделайте это во время выполнения, чтобы запустить код для версии 3.0 и выше:

float version = [[[UIDevice currentDevice] systemVersion] floatValue];
if (version >= 3.0)
    {
    // iPhone 3.0 code here
    }

Ответ 2

Я был бы осторожен с результатом возврата floatValue:

[[[UIDevice currentDevice] systemVersion] floatValue]

Как и в случае с любыми поплавками, это может быть не совсем то, что вы ожидаете. При запуске выше в моей системе, путайте, почему мой условный оператор не выполнялся, я заметил, что возвращаемое значение:

3.20000005

Рекомендовать здесь решения: Как проверить версию iOS?

Выдержки:

NSComparisonResult order = [[UIDevice currentDevice].systemVersion compare: @"3.1.3" options: NSNumericSearch];
if (order == NSOrderedSame || order == NSOrderedDescending) {
    // OS version >= 3.1.3
} else {
    // OS version < 3.1.3
}

Ответ 3

ОБНОВЛЕНИЕ: при создании и работе на iPhone (4.3.1) с использованием Xcode 4 это больше не работает для меня. Кроме того, я получаю __IPHONE_OS_VERSION_MIN_REQUIRED = 30200.

В iPhone Developer Cookbook говорится, что вы также можете:

#ifdef _USE_OS_4_OR_LATER
    // code to compile for 4.0 or later
#else
    // code to compile for pre-4.0
#endif

И, похоже, это работает для меня.:)

Ответ 4

Довольно уверен, что вы также можете сделать:

#ifdef __IPHONE_3_0
// 3.0 code here
#endif

Ответ 5

Это в настройках сборки Xcode. Выпадающий в верхнем левом углу, который говорит что-то вроде "myapp - 3.0 | Debug", Выберите нужную сборку и престо, сделанные вами.

Ответ 6

Используя трюк добавления OTHER_CFLAGS = "-g3 -save-temps -dD" из этого ответа, я обнаружил, что определение __IPHONE_OS_VERSION_MIN_REQUIRED 20000 с проектом, ориентированным на 2.2.1. Возможно, это сработает?

Ответ 7

Я уверен, что комментарий к OP подводит итог. Вы не можете. Поскольку директива времени компиляции не может принять решение во время выполнения. В Xcode, если вы нацеливаете 3.0, он не будет работать на телефоне 2.2.1. Если вы нацелились на 2.2.1, он не будет компилироваться, потому что у вас есть 3,0 конкретных кода.

Единственное истинное решение - это две версии вашего приложения, одна из которых скомпилирована для версии 3.0, а другая для версии 2.2.1.

Ответ 8

Ну, мои два цента:

Как насчет создания вашего приложения с последней версией 3.0, чтобы вы могли использовать все новые и классные API-интерфейсы и указав цель развертывания как самую последнюю версию, которую вы хотите поддержать, поэтому ребята там, которые не тратили время на обновление их устройств будет запускать ваше приложение. В этом случае, как показано выше, вам нужно проверить хотя бы последнюю версию SDK и предоставить альтернативные функции, чтобы сделать ваше приложение обратно совместимым.

С уважением, Hardik