Was ist neu in watchOS 3 Hintergrundaufgaben

Einführung

Mit dem kommenden watchOS 3-Update für alle Apple Watch-Geräte wird sich die Leistung vieler Watch-Anwendungen erheblich verbessern. Dies ist hauptsächlich auf die neuen Formen der Hintergrundausführung zurückzuführen, die von watchOS-Apps genutzt werden können, um ihren Inhalt regelmäßig zu aktualisieren und immer die neuesten Informationen für den Benutzer verfügbar zu haben.

In diesem Tutorial werde ich Ihnen zeigen, wie Sie die neuen WatchKit-APIs in watchOS 3 verwenden können, damit Ihre eigene Anwendung diese neuen Hintergrundaufgaben verwendet. Beachten Sie, dass das System Ihre App möglicherweise nicht im Hintergrund laufen lässt, auch wenn Ihre App zur Unterstützung dieser Hintergrundaktualisierungen ordnungsgemäß eingerichtet ist.

Für dieses Lernprogramm müssen Sie Xcode 8 unter OS X El Capitan oder höher ausführen.

1. Hintergrundaufgaben

Die erste wichtige neue Klasse in watchOS 3 ist die WKRefreshBackgroundTask Klasse. Dies ist eine abstrakte Klasse, die Sie nicht unterordnen oder Instanzen von sich selbst erstellen sollten. Es definiert nur eine Eigenschaft, Benutzerinformation, die zusätzliche Informationen speichern kann, die sich auf die Hintergrundaufgabe beziehen. Es definiert auch eine einzelne Methode, setTaskCompleted (), Sie müssen sich selbst anrufen, um dem System mitzuteilen, dass die Aufgabe abgeschlossen ist. Wenn Sie dies nicht aufrufen, gibt das System die maximal für Ihre App veranschlagte Zeit aus, um die Aufgabe abzuschließen, was wiederum den Akku verschwendet und die Leistung anderer Apps beeinträchtigt.

Wenn Ihre Anwendung eine Hintergrundaufgabe erledigen soll, die abgeschlossen wird, ruft das System die watchOS-Erweiterungsdelegierten auf Griff(_:) Methode. Der einzige Parameter dieser Methode besteht aus WKRefreshBackgroundTask Objekte, die Sie durchlaufen und entsprechend bearbeiten müssen. 

Innerhalb des WatchKit-Frameworks bietet Apple die folgenden vier konkreten Unterklassen an: watchOS übergibt Ihrem Erweiterungsdelegierten je nach Aufgabe eine Instanz der entsprechenden Klasse.

  • WKApplicationRefreshBackgroundTask ist ein allgemeiner Hintergrundaufgabentyp, der nicht auf einen bestimmten Aktualisierungstyp spezialisiert ist. Der häufigste Anwendungsfall für diesen Typ ist das Planen anderer Aufgaben. Sie können beispielsweise eine Hintergrundaktualisierung für Ihre App zu einer bestimmten Tageszeit jeden Tag planen. Wenn die entsprechende WKApplicationRefreshBackgroundTask Das Objekt wird dann an Ihren Erweiterungsdelegaten übergeben Griff(_:) Sie können eine Hintergrund-Netzwerkaufgabe erstellen, um Daten herunterzuladen, um den Inhalt Ihrer App zu aktualisieren.
  • WKSnapshotRefreshBackgroundTask ist ein Aufgabentyp, speziell für den Fall, dass Ihre App ihren Snapshot aktualisieren muss. In diesem Lernprogramm werden wir später über Momentaufnahmen sprechen. Alles, was Sie jetzt wissen müssen, ist, dass der Snapshot einer App als Startbild verwendet wird und auch im Dock des Benutzers angezeigt werden kann (Zugriff durch Drücken der seitlichen Taste). Bitte beachten Sie, dass diese Art von Hintergrundaufgabe eine eindeutige Erledigungsmethode hat, auf die wir später noch eingehen werden.
  • WKWatchConnectivityRefreshBackgroundTask ist ein Aufgabentyp, wenn Sie über das WatchConnectivity-Framework Daten von Ihrem iPhone auf Ihre Uhr übertragen haben. Da dieses Framework eine Methode zum Übertragen von Komplikationsdaten direkt an die Uhr bietet, wird dieser entsprechende Hintergrundaufgabe-Typ hauptsächlich dazu verwendet, Momentaufnahmeaktualisierungen als Reaktion auf den Empfang von Daten vom iPhone zu planen.
  • WKURLSessionRefreshBackgroundTask ist ein Aufgabentyp, der dem Erweiterungsdelegierten zugewiesen wird, wenn eine Hintergrundnetzwerkaufgabe abgeschlossen ist. In diesem Szenario die Delegatmethoden, die Sie für das eingerichtet haben URLSession object wird immer noch aufgerufen, und hier müssen Sie mit den Daten entsprechend arbeiten. Das Griff(_:) Die Methode Ihres Erweiterungsdelegaten wird nur aufgerufen, damit Ihre Anwendung auf den Abschluss des Netzwerkvorgangs reagieren kann. Das WKURLSessionRefreshBackgroundTask gibt Ihnen keinen Zugriff auf die URLSession Objekt noch die Daten, die übertragen wurden. Die einzige zusätzliche Eigenschaft, die es definiert, ist eine aufgerufene Zeichenfolge sessionIdentifier Damit können Sie feststellen, welcher Netzwerkprozess abgeschlossen ist.

Planen einer Aktualisierung

Es gibt verschiedene Möglichkeiten, eine Hintergrundaktualisierung in watchOS 3 zu planen. Für eine einfache Anwendungs- bzw. Momentaufnahme-Aktualisierung können Sie die folgenden beiden Methoden für any verwenden WKExtension Objekt. 

scheduleBackgroundRefresh (withPreferredDate: userInfo: scheduleCompletion :)

Nach Abschluss dieser Methode wird a zurückgegeben WKApplicationRefreshBackgroundTask widersprechen Sie Ihrem Erweiterungsdelegierten. Das watchOS-System versucht, Ihre Nebenstelle zu der von der angegebenen Zeit im Hintergrund zu aktivieren Datum Parameter. 

Bitte beachten Sie, dass nicht garantiert werden kann, dass Ihre Anwendung zu diesem Zeitpunkt im Hintergrund geweckt wird. Aufgrund anderer Umstände (z. B. verbleibender Akku, andere laufende Anwendungen und im Arbeitsspeicher usw.) kann das System die App möglicherweise zu einem späteren Zeitpunkt aktivieren. 

Das Benutzerinformation Der Parameter ist über eines der Hintergrundaufgabenobjekte zugänglich, die an Ihren Erweiterungsdelegaten übergeben werden. Dies kann besonders nützlich sein, wenn Sie nur Informationen senden müssen, die sich auf die aktuelle Aktualisierung beziehen. Zuletzt die scheduleCompletion Der Parameter kann einen Codeblock bereitstellen, der ausgeführt wird, wenn die Aktualisierung geplant wurde oder aufgrund eines Fehlers fehlgeschlagen ist.

scheduleSnapshotRefresh (withPreferredDate: userInfo: scheduleCompletion :) 

Diese Methode gibt a zurück WKSnapshotRefreshBackgroundTask widersprechen Sie Ihrem Erweiterungsdelegierten. Die Parameter für diese Methode sind identisch mit denen beim Planen einer regulären Anwendungsaktualisierung. Der einzige Unterschied bei dieser Methode ist die Art der Aktualisierung, die Sie planen.

Im Folgenden finden Sie ein Beispiel für Code, der an beliebiger Stelle in Ihrer watchOS-Anwendung zum Planen einer Hintergrundaktualisierung verwendet werden kann:

WKExtension.shared (). ScheduleBackgroundRefresh (withPreferredDate: Date (timeIntervalSinceNow: 60 * 60), userInfo: nil) (Fehler: Fehler?) In, wenn Fehler = Fehler Fehler ("Fehler beim Planen der Hintergrundaktualisierung: \ (Fehler aufgetreten ist.) .localizedDescription) ")

Weitere Hintergrundaufgaben erstellen

Wie bereits erwähnt, a WKWatchConnectivityRefreshBackgroundTask wird als Antwort darauf erstellt, dass Sie über das WatchConnectivity-API Daten von seinem gekoppelten iPhone an die Uhr senden. 

Die letzte Art von Hintergrundaufgabe, WKURLSessionRefreshBackgroundTask, wird automatisch vom System geplant, wenn Sie ein System erstellen URLSession Objekt mit einer Hintergrundkonfiguration. Wenn Sie dies von einer beliebigen Stelle Ihrer Watch-App aus tun, führt das System die Anforderung automatisch durch und ruft die Nebenstellen-Delegierten an Griff(_:) Methode, wenn abgeschlossen. Der folgende Beispielcode enthält zwei Funktionen innerhalb einer Beispielklasse. Die erste Funktion konfiguriert und startet einen Download-Hintergrund. Die zweite ist eine in der deklarierte Delegatmethode URLSessionDelegate Protokoll.

class SomeClass: URLSessionDelegate func beginDownloadTask () let config = URLSessionConfiguration.background (withIdentifier: "exampleSessionIdentifier") let Sitzung = URLSession (Konfiguration: config, delegate: self, delegateQueue: nil) let task = session.downloadTask (mit: URL.) (Zeichenfolge: "http://www.example.com/data")!) task.resume () func urlSession (_ session: URLSession, Task: URLSessionTask, didCompleteWithError Fehler: Fehler?) print ("Sitzung wurde abgeschlossen.) ")

2. App-Snapshots ansehen

In watchOS 3 wurden App-Blicke vollständig von der Apple Watch entfernt und stattdessen durch die ersetzt Dock. Dieses Dock wird durch Drücken der Seitentaste an der Uhr aufgerufen und enthält eine beliebige Anzahl von Apps, die der Benutzer konfigurieren kann:

Wenn Ihre App im Dock eines Benutzers platziert wurde, sind Sie dafür verantwortlich, den im Dock angezeigten sichtbaren "Schnappschuss" auf dem neuesten Stand zu halten. 

Ihre App wird benachrichtigt, wenn Sie Ihren Schnappschuss mit einem aktualisieren möchten WKSnapshotBackgroundRefreshTask in Ihren Erweiterungsdelegierten übergeben werden Griff(_:) Methode. Wenn Sie diese Benachrichtigung erhalten und Ihre WatchKit-Erweiterung im Hintergrund aktiviert wird, wird der Root-Interface-Controller Ihrer App auch im Hintergrund und außerhalb des Bildschirms aktiviert. In diesem Prozess werden die folgenden Methoden in dieser Reihenfolge aufgerufen:

  1. Die Root-Interface-Controller wach (withContext :) Methode
  2. Die Root-Interface-Controller willActivate () Methode
  3. Der Erweiterungsdelegierte Griff(_:) Methode

In diesen drei Methoden können Sie jederzeit das Erscheinungsbild der Benutzeroberfläche Ihrer App anpassen, um den im Dock angezeigten Snapshot zu erstellen.

Der letzte Schritt der Aktualisierung des Snapshots erfolgt in den Erweiterungsdelegaten Griff(_:) Methode. Wie bei den anderen Hintergrundaufgabentypen müssen Sie dem System mitteilen, dass die Aufgabe abgeschlossen wurde. Bei Snapshot-Aktualisierungen erfolgt dies jedoch durch Aufruf von setTaskCompleted (restoreDefaultState: geschätzteSnapshotExpiration: userInfo :) Methode auf der WKSnapshotBackgroundRefreshTask Objekt. Sobald Sie diese Methode aufrufen, erfasst watchOS die Momentaufnahme der aktuellen Benutzeroberfläche Ihrer App und speichert diese bis zur nächsten Aktualisierung. Um diese Methode besser zu verstehen, gehen wir alle Parameter durch:

  • restoreDefaultState ist nur ein boolescher Wert, der angibt, ob Ihr Snapshot der erste Schnittstellencontroller Ihrer App ist. Wenn Sie zu einer anderen Schnittstelle gewechselt haben, übergeben Sie diese falsch für diesen Wert. 
  • geschätzteSnapshotExpiration ist ein Datum Objekt, das angibt, wann das System das nächste Mal den Snapshot Ihrer App aktualisieren soll. Wenn Sie nicht sofort eine erneute Aktualisierung planen müssen, können Sie die neue übergeben Date.distantFuture Klasseneigenschaft.
  • Benutzerinformation ist eine Sammlung von benutzerdefinierten Daten und wird an die nächsten weitergegeben WKSnapshotBackgroundRefreshTask Objekt, wenn Sie sofort eine weitere Aktualisierung planen.

3. Verbesserungen an WatchConnectivity

Das in watchOS 2 und iOS 9 eingeführte WatchConnectivity-Framework erhält mit watchOS 3 und iOS 10 auch einige neue Funktionen. 

Wenn ein Benutzer die Komplikationen Ihrer App auf das Zifferblatt gelegt hat, können Sie an einem Tag bis zu 50 Mal Daten vom Telefon zur Uhr übertragen. Dies erfolgt wie bei iOS 9 und watchOS 2 über die WCSession transferCurrentComplication (userInfo :) Instanzmethode. Neu in watchOS 3 und iOS 10 ist das WCSession residualComplicationUserInfoTransfers In dieser Eigenschaft erfahren Sie, wie viele Transfers für diesen Tag noch verfügbar sind.

Noch ein neues WCSession Mit den diesjährigen Plattformaktualisierungen hinzugefügte Eigenschaft ist die hasContentPending Diese Eigenschaft ist nur ein boolescher Wert, der angibt, ob noch Daten zwischen iPhone und Apple Watch übertragen werden müssen.

Wenn Sie mehr über WatchConnectivity und die Funktionsweise von WatchConnectivity erfahren möchten, können Sie unsere vorherigen Tutorials zum Framework lesen.

  • watchOS 2: Kommunikation mit einem Gegenüber

    Die Veröffentlichung von watchOS 2 bringt wesentliche Änderungen mit sich. Eine dieser Änderungen ist die Fähigkeit, problemlos mit einem Gegenüber zu kommunizieren. Es gibt…
    Jorge Costa
    WatchKit
  • watchOS 2: Hintergrundübertragungen und Warteschlangen

    Watch Connectivity ist ein neues Kommunikations-Framework, das neben iOS 9 und watchOS 2 veröffentlicht wurde. Sein Hauptzweck ist die einfache und nahtlose Übertragung von…
    Davis Allie
    WatchKit

Fazit

Insgesamt können Sie mit den neuen APIs in watchOS 3 die Inhalte Ihrer Apple Watch-App im Hintergrund schnell und effizient aktualisieren. Wenn mehr Apps diese neuen APIs verwenden, wird sich die Leistung von watchOS-Apps im Allgemeinen erheblich verbessern und die Benutzererfahrung erheblich verbessern.

Das verknüpfte GitHub-Repo enthält ein watchOS 3 Xcode-Projekt mit Beispielcode, der zeigt, wie Sie Hintergrundaktualisierungen in Ihren eigenen Apps planen und darauf reagieren können.

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