watchOS 2 Hintergrundübertragungen und Warteschlangen

Einführung

Watch Connectivity ist ein neues Kommunikations-Framework, das neben iOS 9 und watchOS 2 veröffentlicht wurde. Der Hauptzweck besteht darin, Informationen einfach und nahtlos zwischen einer Apple Watch-Anwendung und ihrer übergeordneten iOS-Anwendung zu übertragen.

Das Framework bietet viele verschiedene Funktionen. Vor einigen Wochen schrieb Jorge Costa über die Möglichkeit, Nachrichten zwischen einer iOS- und einer Apple Watch-Anwendung zu senden. In diesem Lernprogramm wird die Datenübertragung im Hintergrund vergrößert.

Die Fähigkeit, Nachrichten zu senden, ist für Daten ausgelegt, die das andere Gerät sofort benötigt. Im Gegensatz dazu eignen sich Hintergrundübertragungen am besten für größere Datenblöcke, die vom Gegenüber nicht sofort benötigt werden. Eine Ausnahme bilden Komplikationsinformationen, auf die wir später in diesem Lernprogramm eingehen.

Voraussetzungen

Für dieses Lernprogramm müssen Sie Xcode 7 unter OS X 10.10 oder höher ausführen. Sie müssen auch das Starterprojekt von GitHub herunterladen.

1. Rahmeneinrichtung

Um das Watch Connectivity-Framework verwenden zu können, müssen sowohl Ihre iOS- als auch Ihre watchOS-App über eine Klasse verfügen, die der entspricht WCSessionDelegate Protokoll und konfiguriert den Standard richtig WCSession. Die Methoden der WCSessionDelegate Protokoll übernimmt den Empfang aller Daten über das Watch Connectivity-Framework und ermöglicht Ihnen die Kontrolle über die neuen Daten in Ihrer Anwendung.

Öffnen Sie das Starterprojekt in Xcode und bearbeiten Sie es AppDelegate.swift. Fügen Sie oben Folgendes hinzu einführen Aussage:

WatchConnectivity importieren

Aktualisieren Sie als Nächstes die Klassendefinition der AppDelegate Klasse, um es an die anzupassen WCSessionDelegate Protokoll.

Klasse AppDelegate: UIResponder, UIApplicationDelegate, WCSessionDelegate 

Wir erklären auch eine Eigenschaft vom Typ WCSession! in dem AppDelegate Klasse, um einen Verweis auf die Standardeinstellung zu speichern WCSession Objekt.

var session: WCSession!

Zum Schluss aktualisieren Sie die Anwendung (_: didFinishLaunchingWithOptions :) Methode wie unten gezeigt.

func-Anwendung (Anwendung: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool session = WCSession.defaultSession () session.delegate = self, wenn WCSession.isSupported () true zurückgibt

Im Anwendung (_: didFinishLaunchingWithOptions :), Wir erhalten einen Hinweis auf die Standardeinstellung WCSession setzen Sie den Delegierten der Sitzung auf Ihre App AppDelegate Instanz aktivieren und, falls unterstützt, die Sitzung aktivieren. Das wird unterstützt Mit der Klassenmethode wird geprüft, ob die Gegenstück-WatchOS-App für Ihre iOS-App auf einer gekoppelten Apple Watch installiert ist und Daten senden kann.

Das Setup für die watchOS-Seite ist sehr ähnlich. Öffnen ExtensionDelegate.swift und ersetzen Sie den Inhalt durch Folgendes:

importiere WatchKit importiere WatchConnectivity-Klasse ExtensionDelegate: NSObject, WKExtensionDelegate, WCSessionDelegate var session: WCSession! func applicationDidFinishLaunching () session = WCSession.defaultSession () session.delegate = selbst session.activateSession () func applicationDidBecomeActive ()  func applicationWillResignActive () 

Sie werden feststellen, dass wir nicht anrufen wird unterstützt auf der WCSession Klasse, bevor Sie die Sitzung aktivieren. Dies liegt daran, dass diese Methode immer zurückkehrt wahr auf der watchOS Seite.

Um zu überprüfen, ob alles korrekt funktioniert, führen Sie Ihre Apple Watch-App auf einem der beiden Simulatoren aus (siehe unten).

Führen Sie anschließend Ihre iOS-App auf demselben iPhone-Simulatortyp aus, den Sie beim Ausführen der Watch-App ausgewählt haben.

Sobald Ihre iOS-App gestartet wurde, sollte Ihr Apple Watch-Simulator wie in der Abbildung unten gezeigt wieder auf das Zifferblatt zurückgreifen.

2. Daten senden

Mit der Standardeinstellung WCSession Wenn das Objekt korrekt konfiguriert ist, ist es an der Zeit, einige Daten zwischen iOS und Apple Watch zu senden.

Öffnen TableViewController.swift und fügen Sie am Ende des Codes die folgende Codezeile ein createNewItem (_ :) Methode:

WCSession.defaultSession (). TransferUserInfo (item)

Das transferUserInfo (_ :) Die Methode akzeptiert ein Wörterbuch als einzigen Parameter. Nachdem diese Methode aufgerufen wurde, wird das von Ihnen bereitgestellte Benutzerinformationswörterbuch der Warteschlange der zu übertragenden Informationen hinzugefügt.

Sowohl iOS als auch watchOS arbeiten zusammen, um die Informationen zu einem günstigen Zeitpunkt zu übertragen. Das kombinierte System betrachtet Dinge wie App-Nutzung, Akkulaufzeit, ob das andere Gerät gerade verwendet wird oder nicht usw. Wenn das System die Informationen übertragen hat, führt die App auf dem anderen Gerät beim nächsten Mal eine Delegate-Callback-Methode aus wird gestartet.

Nun ist es an der Zeit, die Empfangsseite auf der Apple Watch zu implementieren. Öffnen ExtensionDelegate.swift und fügen Sie der folgenden Methode hinzu ExtensionDelegate Klasse:

func session (session: WCSession, didReceiveUserInfo userInfo: [String: AnyObject]) dispatch_async (dispatch_get_main_queue ()) () -> Nicht gültig, wenn items = NSUserDefaults.standardUserDefaults ("items") als? [NSDictionary] var newItems = items newItems.append (userInfo) NSUserDefaults.standardUserDefaults (). SetObject (newItems als AnyObject, forKey: "items") else NSUserDefaults.standardUserDefaults (). SetObject ([userInfo]) : "Artikel")   

Diese Methode wird aufgerufen, sobald die Apple Watch-Anwendung ausgeführt wird und die Informationen erfolgreich übertragen wurden.

Beachten Sie, dass dieses Tutorial nur ein Beispiel für die Übertragung von Informationen von iOS auf watchOS zeigt WCSession und WCSessionDelegate Methoden verhalten sich auf beiden Plattformen für Hintergrundübertragungen genau gleich.

Wenn dieser Code implementiert ist, führen Sie Ihre Apple Watch-App im Simulator aus. Führen Sie anschließend die iPhone-App erneut aus und drücken Sie die Taste, um einen neuen Artikel zu erstellen.

Gehen Sie jetzt zurück zum Apple Watch-Simulator und drücken Sie Befehl-Umschalt-H zweimal, um zur neuesten App zurückzukehren. Sie werden sehen, dass das gerade erstellte Element auf der Apple Watch angezeigt wird.

Beachten Sie, dass der Informationsaustausch zwar sofort zwischen den Simulatoren erfolgt, in einer realen Situation mit physischen Geräten jedoch nicht immer der Fall ist.

3. Zugriff auf die Warteschlange für ausstehende Übertragungen

Beenden Sie bei laufender iOS-App den Apple Watch-Simulator über die Menüleiste oder durch Drücken von Befehl-Q. Drücken Sie anschließend die Taste in Ihrer iOS-App, um weitere Elemente zu erstellen (siehe unten).

Wenn Sie versuchen, Informationen mithilfe des Watch Connectivity-Frameworks zu übertragen, werden diese zu einer Warteschlange hinzugefügt, die bei der Übertragung der Informationen allmählich gelöscht wird. Auf diese Warteschlange kann zugegriffen werden, und auf die Übertragungen in der Warteschlange kann zugegriffen werden.

Dies ist nützlich, da Sie sehen können, wie viele Elemente noch ausstehen, und Sie können bei Bedarf sogar bestimmte Übertragungen stornieren. Die soeben erstellten Elemente werden derzeit in der Benutzerinfo-Warteschlange gespeichert, da die Apple Watch derzeit vom übergeordneten Gerät getrennt ist, wodurch eine Übertragung unmöglich wird.

Öffnen AppDelegate.swift und fügen Sie den folgenden Code am Ende von ein Anwendung (_: didFinishLaunchingWithOptions :):

let transfers = session.outstandingUserInfoTransfers wenn transfers.count> 0 let transfer = transfers.first! transfer.cancel ()

Mit diesem Code greifen wir auf die ausstehenden Benutzerinformationstransfers zu und stornieren, falls vorhanden, die erste Übertragung. Das WCSessionUserInfoTransfer Objekte, die vom zurückgegeben wurden standingUserInfoTransfers Eigenschaft hat auch zwei schreibgeschützte Eigenschaften, auf die Sie zugreifen können:

  • Benutzerinformation: Diese Eigenschaft speichert das Wörterbuch, das Sie übertragen.
  • Übertragen: Diese Eigenschaft speichert einen booleschen Wert und gibt an, ob die Benutzerinformationen gerade übertragen werden.

Im Watch Connectivity-Framework stehen nicht viele Funktionen für herausragende Informationsübertragungen zur Verfügung. Abhängig von Ihrer Anwendung können einige dieser Funktionen jedoch sehr nützlich sein.

4. Andere Übertragungsmethoden

In diesem Lernprogramm wurden nur Hintergrundübertragungen von Benutzerinformationen behandelt. Es gibt jedoch einige andere Möglichkeiten, Daten zwischen Geräten zu übertragen. Jede dieser Methoden wurde für einen bestimmten Zweck entwickelt, wenn zwischen einem iPhone und einer Apple Watch kommuniziert wird.

Anwendungskontext

Hier müssen Sie Informationen zwischen Geräten übertragen, bei denen nur die neuesten Informationen relevant sind. Sie übertragen ein einzelnes Wörterbuch, indem Sie die updateApplicationContext (_: Fehler :) Methode. Das Error Parameter in dieser Methode ist ein Zeiger auf ein NSError Objekt, das mit Informationen gefüllt wird, wenn bei der Übertragung ein Problem auftritt.

Auf der Empfangsseite können Sie das implementieren Sitzung (_: didReceiveApplicationContext :) oder alternativ auf den Anwendungskontext über die Standardeinstellung zugreifen WCSession Objekt ist receiveApplicationContext Eigentum.

Informationen zur Komplikation

Hier müssen Sie ein einzelnes Benutzer-Info-Wörterbuch speziell für die benutzerdefinierte Komplikation Ihrer App übertragen. Sie können nur Informationen von der iOS-Seite senden, und dies geschieht mit der transferCurrentComplicationUserInfo (_ :) Methode.

Der Hauptunterschied zwischen diesem und dem transferUserInfo (_ :) Die Methode, die zuvor in diesem Lernprogramm verwendet wurde, besteht darin, dass das System beim Aktualisieren einer Komplikation immer versucht, die Informationen sofort zu übertragen.

Beachten Sie, dass eine Übertragung nicht garantiert werden kann, da die Geräte getrennt werden können oder Ihre Komplikation das Budget für die Hintergrundausführung überschritten hat. Wenn eine Übertragung von Komplikationsinformationen nicht abgeschlossen werden kann, wird sie dem hinzugefügt standingUserInfoTransfers Warteschlange, wo es angezeigt und bei Bedarf abgebrochen werden kann.

Beachten Sie auch, wenn sich in der Warteschlange eine Komplikations-Info-Übertragung befindet und Sie das anrufen transferCurrentComplicationUserInfo (_ :) Wiederum wird die vorhandene Übertragung in der Warteschlange für ungültig erklärt und abgebrochen.

Dateien

Sie können das Watch Connectivity-Framework sogar verwenden, um Dateien zwischen Geräten zu übertragen. Dies geschieht über die transferFile (_: metaData :) Methode, bei der der erste Parameter ein lokaler ist NSURL zu der Datei und das zweite ist ein optionales Wörterbuch, das zusätzliche Daten enthält, die dieser Datei zugeordnet sind.

Wie zu erwarten, wird der Empfang dieser Datei von einer Methode der WCSessionDelegate Protokoll, das Sitzung (_: didReceiveFile :) um genau zu sein. In dieser Methode erhalten Sie eine einzige WCSessionFile Objekt, das eine neue lokale URL zur aktuellen Datei sowie die übertragenen Metadaten enthält.

Wie bei der Übertragung von Benutzerinformationen können Sie auch ausstehende oder laufende Dateiübertragungen über die Standardeinstellung anzeigen WCSession Objekt ist excellentFileTransfers Eigentum.

Fazit

Insgesamt bietet das Watch Connectivity-Framework eine sehr einfache und benutzerfreundliche Schnittstelle für die Datenübertragung zwischen einem angeschlossenen iPhone und einer Apple Watch. Das Framework ermöglicht die Übertragung von Benutzerinformationen, Anwendungskontext- und Komplikationsinfo-Wörterbüchern sowie von Dateien.

Sie sollten nun mit dem Senden und Empfangen von Informationen mit dem Watch Connectivity-Framework vertraut sein und wissen, wie Sie mit ausstehenden Übertragungen interagieren können.

Bitte hinterlassen Sie wie immer Ihre Kommentare und Rückmeldungen in den Kommentaren unten.