Как настроить таргетинг на конкретную версию iPhone? - PullRequest
36 голосов
/ 04 мая 2009

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

#if TARGET_OS_IPHONE

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

Ответы [ 8 ]

89 голосов
/ 05 мая 2009

Вы можете использовать этот #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
    }
19 голосов
/ 28 марта 2011

Я был бы осторожен с возвращаемым результатом 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
}
6 голосов
/ 22 ноября 2010

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

Поваренная книга разработчика iPhone говорит, что вы также можете сделать:

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

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

4 голосов
/ 14 сентября 2010

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

#ifdef __IPHONE_3_0
// 3.0 code here
#endif
0 голосов
/ 03 августа 2009

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

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

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

0 голосов
/ 04 мая 2009

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

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

0 голосов
/ 04 мая 2009

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

0 голосов
/ 04 мая 2009

Это в опциях сборки Xcode. Раскрывающийся список в верхнем левом углу с надписью «myapp - 3.0 | Debug» Выберите нужную сборку и нажмите «Готово».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...