Szybka odpowiedź…
Jak Swift 2.0 można używać #availablew sposób iflub guardw 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 UIPopoverControllerjest 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 CLLocationManageri 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 NSProcessInfonowsze wersje zawiera metodę przeprowadzania porównań wersji z mniejszą szansą na błąd:
- (BOOL)isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion)version
Projekty ukierunkowane na starsze systemy mogą korzystać systemVersionz 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 systemVersiontego właśnie chcesz, potraktuj go jak ciąg znaków lub ryzykujesz obcięciem numeru wersji łatki (np. 3.1.2 -> 3.1).