Как настроить таргетинг на определенную версию 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