Быстрый ответ…
Начиная с 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).