Szybka odpowiedź…
Jak Swift 2.0 można używać #available
w sposób if
lub guard
w kodzie ochronnym, który powinien być prowadzony tylko na niektórych systemach.
if #available(iOS 9, *) {}
W Objective-C musisz sprawdzić wersję systemu i wykonać porównanie.
[[NSProcessInfo processInfo] operatingSystemVersion]
w iOS 8 i nowszych.
Począwszy od Xcode 9:
if (@available(iOS 9, *)) {}
Pełna odpowiedź…
W Objective-C i Swift w rzadkich przypadkach lepiej jest unikać polegania na wersji systemu operacyjnego jako wskazania możliwości urządzenia lub systemu operacyjnego. Zwykle istnieje bardziej niezawodna metoda sprawdzania, czy dostępna jest określona funkcja lub klasa.
Sprawdzanie obecności interfejsów API:
Na przykład możesz sprawdzić, czy UIPopoverController
jest dostępny na bieżącym urządzeniu, używając NSClassFromString
:
if (NSClassFromString(@"UIPopoverController")) {
// Do something
}
W przypadku słabo połączonych klas wysyłanie wiadomości do klasy jest bezpieczne. W szczególności działa to w ramach, które nie są jawnie powiązane jako „Wymagane”. W przypadku brakujących klas wyrażenie przyjmuje wartość zero, co nie spełnia warunku:
if ([LAContext class]) {
// Do something
}
Niektóre klasy, takie jak CLLocationManager
i UIDevice
, zapewniają metody sprawdzania możliwości urządzenia:
if ([CLLocationManager headingAvailable]) {
// Do something
}
Sprawdzanie obecności symboli:
Bardzo rzadko musisz sprawdzić obecność stałej. Pojawiło się to w iOS 8 wraz z wprowadzeniem UIApplicationOpenSettingsURLString
, używanej do ładowania aplikacji Ustawienia przez -openURL:
. Wartość nie istniała przed iOS 8. Przekazywanie wartości zerowej do tego interfejsu API ulegnie awarii, dlatego najpierw należy sprawdzić, czy istnieje stała:
if (&UIApplicationOpenSettingsURLString != NULL) {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
}
Porównanie z wersją systemu operacyjnego:
Załóżmy, że masz do czynienia ze stosunkowo rzadką potrzebą sprawdzenia wersji systemu operacyjnego. W przypadku projektów kierowanych na iOS 8 i NSProcessInfo
nowsze wersje zawiera metodę przeprowadzania porównań wersji z mniejszą szansą na błąd:
- (BOOL)isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion)version
Projekty ukierunkowane na starsze systemy mogą korzystać systemVersion
z UIDevice
. Apple używa go w przykładowym kodzie 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;
}
Jeśli z jakiegokolwiek powodu zdecydujesz, że systemVersion
tego właśnie chcesz, potraktuj go jak ciąg znaków lub ryzykujesz obcięciem numeru wersji łatki (np. 3.1.2 -> 3.1).