Die schnelle Antwort
Ab Swift 2.0 können Sie #available
in einem if
ou guard
zum Schutz von Code, der nur auf bestimmten Systemen ausgeführt werden soll.
if #available(iOS 9, *) {}
In Objective-C müssen Sie die Systemversion prü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 Version des Betriebssystems als Hinweis auf die Fähigkeiten des Geräts oder des Betriebssystems zu verlassen. In der Regel gibt es eine zuverlässigere Methode, um zu prüfen, ob eine bestimmte Funktion oder Klasse verfügbar ist.
Überprüfung auf das Vorhandensein von APIs:
Sie können zum Beispiel prüfen, ob UIPopoverController
ist auf dem aktuellen Gerät verfügbar mit NSClassFromString
:
if (NSClassFromString(@"UIPopoverController")) {
// Do something
}
Bei schwach verknüpften Klassen ist es sicher, die Klasse direkt zu melden. Dies gilt insbesondere für Frameworks, die nicht explizit als "Required" verlinkt sind. Bei fehlenden Klassen wird der Ausdruck zu Null ausgewertet, wodurch die Bedingung nicht erfüllt wird:
if ([LAContext class]) {
// Do something
}
Einige Klassen, wie CLLocationManager
y UIDevice
bieten Methoden zur Überprüfung der Gerätefähigkeiten:
if ([CLLocationManager headingAvailable]) {
// Do something
}
Überprüfung auf das Vorhandensein von Symbolen:
Gelegentlich müssen Sie prüfen, ob eine Konstante vorhanden ist. Dies geschah in iOS 8 mit der Einführung von UIApplicationOpenSettingsURLString
zum Laden der App Einstellungen über -openURL:
. Der Wert existierte vor iOS 8 nicht. Die Übergabe von nil an diese API führt zum Absturz, daher müssen Sie zuerst die Existenz der Konstante überprüfen:
if (&UIApplicationOpenSettingsURLString != NULL) {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
}
Vergleich mit der Version des Betriebssystems:
Nehmen wir an, Sie müssen relativ selten die Version des Betriebssystems überprüfen. Für Projekte, die auf iOS 8 und höher abzielen, NSProcessInfo
enthält eine Methode zur Durchführung von Versionsvergleichen mit geringerer Fehlerwahrscheinlichkeit:
- (BOOL)isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion)version
Projekte, die auf ältere Systeme abzielen, können Folgendes nutzen systemVersion
en UIDevice
. Apple verwendet es in seinen GLSprite Beispiel-Code.
// 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 beschließen, dass systemVersion
ist das, was Sie wollen, stellen Sie sicher, dass Sie es als Zeichenkette behandeln, oder Sie riskieren, die Patch-Revisionsnummer abzuschneiden (z.B. 3.1.2 -> 3.1).
7 Stimmen
Anmerkung des Moderators : Im Laufe der Zeit sind auf diese Frage über 30 Antworten eingegangen. Bevor Sie eine neue Antwort hinzufügen, sollten Sie sicher dass Ihre Lösung nicht bereits zur Verfügung gestellt wurde.
5 Stimmen
Xcode 7 starten,
if #available(iOS 9, *) {}
in Swift. Xcode 9 starten,if (@available(iOS 11, *)) {}
in objektiv-c.0 Stimmen
Prüfen Sie dies github.com/aleemrazzaq/ARCompactDeviceInfo