Как настроить таргетинг на конкретную версию iPhone?
У меня есть код, который я хочу выполнить только на последнем iPhone SDK (3.0), однако я не могу найти способ нацелиться только на 3.0 и игнорировать 2.2.1 и т. Д. Есть оператор ifdef, но он просто кажется, чтобы покрыть весь iPhone:
#if TARGET_OS_IPHONE
Любая помощь приветствуется.
8 ответов
Вы можете использовать этот #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
}
Я был бы осторожен с возвращаемым результатом 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
}
ОБНОВЛЕНИЕ: При сборке и запуске на iPhone (4.3.1) с использованием Xcode 4, это больше не работает для меня. Кроме того, я получаю __IPHONE_OS_VERSION_MIN_REQUIRED = 30200
,
Поваренная книга iPhone Developer говорит, что вы также можете сделать:
#ifdef _USE_OS_4_OR_LATER
// code to compile for 4.0 or later
#else
// code to compile for pre-4.0
#endif
И, похоже, работает для меня.:)
Уверен, что вы также можете сделать:
#ifdef __IPHONE_3_0
// 3.0 code here
#endif
Я вполне уверен, что комментарий к ОП подводит итог. Ты не можешь Потому что директива времени компиляции не может принимать решение во время выполнения. В Xcode, если вы настроены на 3.0, он не будет работать на телефоне 2.2.1. Если вы нацелились на 2.2.1, он не скомпилируется, потому что у вас есть специальный код 3.0.
Единственное верное решение - две версии вашего приложения, одна из которых скомпилирована для 3.0, а другая для 2.2.1.
Используя хитрость добавления OTHER_CFLAGS = "-g3 -save-temps -dD" из этого ответа, я обнаружил, что определение __IPHONE_OS_VERSION_MIN_REQUIRED 20000 с проектом, нацеленным на 2.2.1. Возможно, это будет работать?
Это в опциях сборки Xcode. Раскрывающийся список в верхнем левом углу, который говорит что-то вроде "myapp - 3.0 | Debug". Выберите сборку, которую хотите, и заранее, готово.
Ну, мои два цента
Как насчет создания вашего приложения с последней версией, скажем, 3.0, чтобы вы могли использовать все новые и классные API-интерфейсы и указывать цель развертывания в качестве наименее свежей версии, которую вы хотите поддерживать, чтобы ребята, которые не потратили время на обновление своих устройств по-прежнему будет запускать ваше приложение. В этом случае, как показано выше, вам необходимо проверить наличие самой последней версии SDK и предоставить альтернативную функциональность, чтобы сделать ваше приложение обратно совместимым.
С уважением, Хардик