Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Например:

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
}