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.
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.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) ")
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.) ")
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:
wach (withContext :)
MethodewillActivate ()
MethodeGriff(_:)
MethodeIn 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.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.
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.