Swift 2 Verfügbarkeitsprüfung

In diesem kurzen Tutorial möchte ich mich auf die brandneue Syntax von Swift für die Verfügbarkeitsprüfung konzentrieren. Wenn Sie iOS oder OS X entwickelt haben, wissen Sie, wie langwierig es sein kann, zu überprüfen, ob eine bestimmte API auf dem Gerät verfügbar ist, auf dem Ihre Anwendung ausgeführt wird. In Swift 2 ist dies für Entwickler viel weniger schmerzhaft geworden.

Das Problem

Stellen Sie sich das folgende Szenario vor. Sie entwickeln eine iOS-Anwendung für iOS 7 und höher. Auf der WWDC des letzten Jahres hat Apple eine neue API für die Registrierung von Benachrichtigungen eingeführt.

registerUserNotificationSettings (_ :) 

Bedeutet das, dass Sie das Implementierungsziel Ihrer Anwendung von iOS 7 auf iOS 8 erhöhen müssen? Sie könnten dies tun, aber es würde einen erheblichen Teil der Benutzerbasis Ihrer Anwendung in der Kälte lassen, nur um die neuen Richtlinien von Apple für lokale und Remote-Benachrichtigungen einzuhalten. Ihre Benutzer werden es Ihnen nicht danken.

Alternativ können Sie die neue API nur auf Geräten verwenden, auf denen iOS 8 oder höher ausgeführt wird. Das macht mehr Sinn. Recht? Die Implementierung würde ungefähr so ​​aussehen.

Anwendung func (Anwendung: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool if UIApplication.instancesRespondToSelector ("registerUserNotificationSettings:") let types = UIUserNotificationType.Alert | UIUserNotificationType.Sound | UIUserNotificationType.Badge let settings = UIUserNotificationSettings (forTypes: types, categories: nil) application.registerUserNotificationSettings (Einstellungen) Rückgabewert true 

Dies ist eine praktikable Option, aber nicht ohne Risiko. In diesem Tutorial werde ich nicht näher auf die Risiken eingehen, aber ich möchte betonen, dass die meisten Entwickler denken, dass es gut ist, den obigen Ansatz zu verwenden. Das folgende Beispiel zeigt eine Variation dieses Ansatzes, diesmal mit Objective-C.

if ([UIUserNotificationSettings-Klasse]) [application registerUserNotificationSettings: [UIUserNotificationSettings settingsForTypes: (UIUserNotificationTypeAlert | UIUserNotificationTypeSound | UIUserNotificationTypeBadge) | Kategorien: nil]];  

Während beide Ansätze in den meisten Situationen funktionieren, gibt es Situationen, in denen Sie auf Probleme stoßen. Einige APIs beginnen beispielsweise als private APIs und werden zu einem späteren Zeitpunkt veröffentlicht. In diesem Szenario schlagen Sie möglicherweise private APIs auf Geräten an, auf denen ein Betriebssystem ausgeführt wird, in dem diese APIs noch nicht öffentlich sind. Und ich bin sicher, Sie wissen, was das bedeutet.

Die Lösung

Dank der Arbeit des Swift-Teams ist die Lösung unseres Problems in Swift 2 einfach und unkompliziert. Sehen Sie sich das folgende Beispiel an. Beachten Sie, dass das Implementierungsziel des Projekts mit iOS 7 festgelegt ist Schnell 2 und Xcode 7.

In diesem Beispiel verwenden wir APIs, die in iOS 8 eingeführt wurden. Da der Compiler weiß, dass das Implementierungsziel des Projekts auf iOS 7 festgelegt ist, wird ein Fehler ausgegeben, der besagt, dass die gewünschten APIs nur in verfügbar sind iOS 8 und höher. Dies weiß er, indem er das SDK auf Verfügbarkeitsinformationen überprüft. Wenn Sie drücken Befehl und klicken Sie auf die registerUserNotificationSettings (_ :) Methode sollte man so etwas sehen.

@available (iOS 8.0, *) func registerUserNotificationSettings (notificationSettings: UIUserNotificationSettings) 

Glücklicherweise bietet Xcode eine Lösung, um das Problem zu lösen. Es wird empfohlen, eine Versionsprüfung zu verwenden, um zu verhindern, dass die APIs, die exklusiv für iOS 8 und höher gelten, aufgerufen werden, wenn unsere Benutzer die Anwendung unter einer älteren Version von iOS ausführen.

Beachten Sie, dass diese Funktion in Swift 2 eingeführt wurde. Der Compiler gibt keinen Fehler aus, wenn Sie Swift 1.2 verwenden. Das Hinzufügen der Versionsprüfung macht das Beispiel auch verständlicher. Schauen Sie sich das aktualisierte Beispiel unten an, in dem wir den Ratschlägen von Xcode folgen.

func application (Anwendung: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool if #available (iOS 8.0, *) Let Types = UIUserNotificationType ([UIUserNotificationType.Alert, UIUserNotificationType); let settings = UIUserNotificationSettings (forTypes: types, categories: nil) application.registerUserNotificationSettings (Einstellungen) Rückgabe true 

Die Syntax ist klar und verständlich. Mit der Verfügbarkeitssyntax prüfen wir, ob die Anwendung auf einem Gerät mit iOS 8 und höher läuft. Wenn nicht, dann ob Die Klausel wird übersprungen, andernfalls ruft die Anwendung die neue API für die Benachrichtigungsregistrierung auf.

Syntax

Die Syntax ist unkompliziert. Wir beginnen die Verfügbarkeitsbedingung mit #verfügbar und wickeln Sie den Zustand in Klammern. Wir können so viele Plattformen hinzufügen, wie nötig, und die Liste der Plattformen durch Kommas trennen.

if #available (iOS 8.0, OSX 10.10, watchOS 2, *) … 

Beachten Sie, dass wir die Liste der Plattformen mit einem Sternchen beenden. Dieses Sternchen ist erforderlich und zeigt an, dass das ob Die Klausel wird auf dem minimalen Implementierungsziel für jede Plattform ausgeführt, die nicht in der Liste der Plattformen enthalten ist.

Wie wir zuvor gesehen haben, können wir die verwenden @verfügbar Attribut, um Verfügbarkeitsinformationen zu Funktionen, Methoden und Klassen hinzuzufügen. Im folgenden Beispiel sagen wir dem Compiler, dass das useFancyNewAPI sollte nur auf Geräten ab iOS 9 aufgerufen werden.

@available (iOS 9.0, *) func useFancyNewAPI () … 

Fazit

Beachten Sie, dass die Verfügbarkeitssyntax für die beiden Beispiele, die ich Ihnen zu Beginn dieses Lernprogramms gezeigt habe, keine Alternative ist. Diese Beispiele sind fehlerhaft und sollten nur verwendet werden, wenn Sie Objective-C oder eine frühere Version von Swift verwenden.

Die Verfügbarkeitssyntax ist ein weiterer Grund für die Migration Ihrer Swift-Projekte zu Swift 2. Sie macht fehleranfällige Lösungen zur Überprüfung der API-Verfügbarkeit überflüssig. Die Welt sieht mit Swift 2 ein bisschen freundlicher aus?