Швидка відповідь ...
За 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. Передача нуля в цей 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).