Быстрый ответ ...
По Swift 2.0, вы можете использовать #available
в if
или guard
для защиты кода , который должен быть запущен только на некоторых системах.
if #available(iOS 9, *) {}
В Objective-C вам необходимо проверить версию системы и выполнить сравнение.
[[NSProcessInfo processInfo] operatingSystemVersion]
в iOS 8 и выше.
Начиная с Xcode 9:
if (@available(iOS 9, *)) {}
Полный ответ ...
В Objective-C и Swift в редких случаях лучше не полагаться на версию операционной системы в качестве показателя возможностей устройства или ОС. Обычно существует более надежный метод проверки, доступна ли конкретная функция или класс.
Проверка на наличие API:
Например, вы можете проверить, UIPopoverController
доступно ли на текущем устройстве, используя NSClassFromString
:
if (NSClassFromString(@"UIPopoverController")) {
// Do something
}
Для слабосвязанных классов безопасно отправлять сообщения классу напрямую. Примечательно, что это работает для фреймворков, которые явно не связаны как «Обязательные». Для отсутствующих классов выражение оценивается как ноль, выполняя условие:
if ([LAContext class]) {
// Do something
}
Некоторые классы, такие как CLLocationManager
и UIDevice
, предоставляют методы для проверки возможностей устройства:
if ([CLLocationManager headingAvailable]) {
// Do something
}
Проверка на наличие символов:
Очень редко вы должны проверять наличие постоянной. Это появилось в iOS 8 с введением UIApplicationOpenSettingsURLString
, используемым для загрузки приложения настроек через -openURL:
. Это значение не существовало до iOS 8. Передача nil в этот API приведет к сбою, поэтому сначала необходимо убедиться, что константа существует:
if (&UIApplicationOpenSettingsURLString != NULL) {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
}
Сравнение с версией операционной системы:
Предположим, вы столкнулись с относительно редкой необходимостью проверки версии операционной системы. Для проектов, ориентированных на iOS 8 и выше, NSProcessInfo
включает метод для сравнения версий с меньшей вероятностью ошибки:
- (BOOL)isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion)version
Проекты, ориентированные на более старые системы, можно использовать systemVersion
на UIDevice
. Apple использует его в своем примере кода GLSprite .
// A system version of 3.1 or greater is required to use CADisplayLink. The NSTimer
// class is used as fallback when it isn't available.
NSString *reqSysVer = @"3.1";
NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
if ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending) {
displayLinkSupported = TRUE;
}
Если по какой-либо причине вы решили, что systemVersion
это именно то, что вам нужно, убедитесь, что вы воспринимаете это как строку, иначе вы рискуете урезать номер редакции патча (например, 3.1.2 -> 3.1).