Die schnelle Antwort…
Ab Swift 2.0 können Sie #available
in einem if
oder guard
zum Schutz von Code verwenden, der nur auf bestimmten Systemen ausgeführt werden sollte.
if #available(iOS 9, *) {}
In Objective-C müssen Sie die Systemversion überprüfen und einen Vergleich durchführen.
[[NSProcessInfo processInfo] operatingSystemVersion]
in iOS 8 und höher.
Ab Xcode 9:
if (@available(iOS 9, *)) {}
Die vollständige Antwort…
In Objective-C und in seltenen Fällen in Swift ist es besser, sich nicht auf die Betriebssystemversion als Hinweis auf Geräte- oder Betriebssystemfunktionen zu verlassen. Es gibt normalerweise eine zuverlässigere Methode, um zu überprüfen, ob ein bestimmtes Feature oder eine bestimmte Klasse verfügbar ist.
Überprüfen, ob APIs vorhanden sind:
Sie können beispielsweise überprüfen, ob UIPopoverController
auf dem aktuellen Gerät Folgendes verfügbar ist NSClassFromString
:
if (NSClassFromString(@"UIPopoverController")) {
// Do something
}
Bei schwach verknüpften Klassen ist es sicher, die Klasse direkt zu benachrichtigen. Dies funktioniert insbesondere für Frameworks, die nicht explizit als "Erforderlich" verknüpft sind. Bei fehlenden Klassen wird der Ausdruck mit Null ausgewertet, wobei die Bedingung nicht erfüllt wird:
if ([LAContext class]) {
// Do something
}
Einige Klassen, wie CLLocationManager
und UIDevice
, bieten Methoden zum Überprüfen der Gerätefunktionen:
if ([CLLocationManager headingAvailable]) {
// Do something
}
Überprüfen, ob Symbole vorhanden sind:
Sehr gelegentlich müssen Sie prüfen, ob eine Konstante vorhanden ist. Dies kam in iOS 8 mit der Einführung von UIApplicationOpenSettingsURLString
, verwendet, um Einstellungen App über zu laden -openURL:
. Der Wert war vor iOS 8 nicht vorhanden. Wenn Sie nil an diese API übergeben, stürzt dies ab. Überprüfen Sie daher zunächst, ob die Konstante vorhanden ist:
if (&UIApplicationOpenSettingsURLString != NULL) {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
}
Vergleich mit der Betriebssystemversion:
Nehmen wir an, Sie sehen sich mit der relativ seltenen Notwendigkeit konfrontiert, die Betriebssystemversion zu überprüfen. NSProcessInfo
Enthält für Projekte mit iOS 8 und höher eine Methode zum Durchführen von Versionsvergleichen mit geringerer Fehlerwahrscheinlichkeit:
- (BOOL)isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion)version
Projekte, die auf ältere Systeme abzielen, können systemVersion
auf verwendet werden UIDevice
. Apple verwendet es in seinem GLSprite- Beispielcode.
// 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;
}
Wenn Sie aus irgendeinem Grund entscheiden, dass dies das systemVersion
ist, was Sie möchten, stellen Sie sicher , dass Sie es als Zeichenfolge behandeln, da sonst die Patch-Versionsnummer abgeschnitten werden kann (z. B. 3.1.2 -> 3.1).