Использование функций iOS 5 без нарушения обратной совместимости

В настоящее время мое приложение скомпилировано с последней версией iOS 4.x SDK. Когда выйдет iOS 5.0 SDK, смогу ли я использовать новые функции iOS 5.0 SDK в своем приложении, и при этом запустить его на устройствах iOS 4 (но с отключенными компонентами, использующими новые функции)?

2 ответа

Решение

Чтобы ответить на этот вопрос в целом, среда выполнения Objective-C является полностью отражающей, что означает, что вы можете запросить, какие методы поддерживает объект (через respondsToSelector:) и получить классы по имени во время выполнения (через NSClassFromString). Двоичные файлы iOS также поддерживают концепцию слабой связи с фреймворками, что означает, что фреймворк будет загружен, если он доступен, но вы не считаете это фатальной ошибкой, если фреймворк недоступен (как поведение по умолчанию).

Это означает, что когда Apple выпускает новые версии ОС, вы можете написать код, который использует новые функции в последней версии ОС, но прекрасно работает без них, если эти новые функции являются новыми частями API.

Apple также иногда предоставляет новые функции SDK, которые не являются новыми API, например, когда в Xcode был добавлен статический анализатор Clang. Поскольку эти функции обычно не требуют поддержки во время выполнения, они полностью доступны для использования. iOS 5 немного уникальна, поскольку обязательства Apple по проекту LLVM позволяют предположить, что в ARC есть некоторые новые функции времени компиляции, которые полагаются на некоторую поддержку времени выполнения. Так что они будут недоступны, если действительно будут в инструментах, которые Apple намеревается распространять.

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

Например:

Class motionManagerClass = NSClassFromString(@"CMMotionManager");
if(motionManagerClass) {
    CMMotionManager *motionManager = [[CMMotionManager alloc] init];
    if([motionManager isGyroAvailable]) {
        //iOS device with gyro
    }else {
        //right iOS but device has no gyro
    }
}else{
//wrong iOS
}
Другие вопросы по тегам