HKObserverQuery
hat die folgende Methode, die das Empfangen von Updates im Hintergrund unterstützt:
- initWithSampleType:predicate:updateHandler:
Das updateHandler
hat eine completionHandler
mit folgender Dokumentation :
Dieser Block wird an den Update-Handler übergeben. Sie müssen diesen Block aufrufen, sobald Sie mit der Verarbeitung der eingehenden Daten fertig sind. Durch Aufrufen dieses Blocks wird HealthKit mitgeteilt, dass Sie die Hintergrunddaten erfolgreich empfangen haben. Wenn Sie diesen Block nicht aufrufen, versucht HealthKit weiterhin, Ihre App mithilfe eines Backoff-Algorithmus zu starten. Wenn Ihre App nicht dreimal reagiert, geht HealthKit davon aus, dass Ihre App keine Daten empfangen kann, und sendet keine Hintergrundaktualisierungen mehr.
Wenn man sich andere Beiträge ansieht, scheint es eine Menge Verwirrung um diesen Handler zu geben. Im Folgenden sind einige Fragen aufgeführt, die ich dazu habe:
- Wann sollte der Handler angerufen werden? Wenn der Anruf zu spät erfolgt, könnte HK der Ansicht sein, dass die App das Abfrage-Update nie erhalten hat, sodass Sie den 3-Strikes-Back-Off-Algorithmus für das Hintergrund-Update verwenden. In der Dokumentation wird angegeben, dass es nach der Bearbeitung anderer Abfragen aufgerufen werden soll. Abhängig davon, wie lange es dauern würde, diese Abfragen auszuführen, scheint es, als könnten Sie gefährlich nahe daran sein, die Hintergrundaktualisierungsschläge zu treffen.
- Warum wird das benötigt? Sollte das System nicht wissen, dass die App gestartet wurde und das Hintergrundupdate erhalten hat? Bei Verwendung
CoreBluetooth
im Hintergrund wird Ihre App nur 10 Sekunden lang im Hintergrund aktiviert. Sie müssen keinen Handler anrufen oder sich mit dem Hintergrundupdate 3-Strikes befassen. - Wenn Sie das Hintergrund-Update 3-Strikes drücken und HK keine Updates mehr sendet, ist das dauerhaft? Sendet HK jemals wieder Hintergrund-Updates? Was ist, wenn es einen Fehler gibt, der den Aufruf des Handlers verhindert hat, und Sie ihn jetzt behoben haben? Steht die App fest und erhält sie nie die Updates? Oder wird es zurückgesetzt, wenn die App neu gestartet oder aktualisiert wird?
- Lässt HK Ihre App im Hintergrund laufen, bis der Handler aufgerufen wird? Ist das Teil seines Zwecks oder nur eine Nebenwirkung? Wenn es Teil seines Zwecks ist, wie lange können wir laufen, bevor wir anhalten müssen (und den ersten Hintergrundaktualisierungsschlag ausführen)?
Antworten:
Rufen Sie es an, nachdem Sie Ihre Arbeit erledigt haben. Ihr Code sollte keine komplexen Operationen ausführen. Die App befindet sich im Hintergrund und der Benutzer sieht nicht, was sich geändert hat. Sie können einfach ein "Flag" setzen, dass Daten aktualisiert werden, und komplexe Vorgänge ausführen, nachdem der Benutzer die App gestartet hat. Wenn Ihre Entscheidung entweder den Benutzer benachrichtigt oder nicht auf komplexen Vorgängen basiert, versuchen Sie, den Code so umzugestalten, dass alle erforderlichen Daten vorberechnet werden (z. B. in UserDefaults) und zusätzliche Daten einfach mit diesen Daten abgerufen werden. Für Ihre Berechnung reichen also 1-2 Sekunden.
Alle diese Handler haben Abschlussschließungen. Sie werden für iOS benötigt, um festzustellen, ob Ihre App einwandfrei funktioniert. Wenn Ihre App zu viel CPU-Zeit verbraucht, kann iOS langsam werden. Daher möchte Apple sicherstellen, dass iOS trotz schlechter Apps einwandfrei funktioniert.
Nein.
Ja. Aber es hängt von vielen Faktoren ab. Möglicherweise wird versucht, Ihre App innerhalb von 1-2 Tagen erneut aufzurufen. Wenn sich nichts ändert, wird es selten aufgerufen.
Das ist unbekannt. Es hängt von vielen Faktoren ab. Wenn das iPhone aufgeladen wird, kann Ihre App wahrscheinlich länger ausgeführt werden, um abzuschätzen, ob das Abschluss-Handle aufgerufen wird oder nicht. Wenn Ihr iPhone nicht aufgeladen und auf 0% Akku geschlossen ist, wird Ihre App mit größerer Wahrscheinlichkeit von iOS beendet. Sie sollten also keine Arbeit erledigen, nachdem Sie den Completion-Handler aufgerufen haben. Und versuchen Sie es einfach zu halten.
Empfehlungen
Sie sollten neue Daten so schnell wie möglich verarbeiten. Wenn Sie viele Daten abrufen müssen, versuchen Sie, diese zu optimieren und vorab zu berechnen, wenn sich die App im Vordergrund befindet. Speichern Sie sie dann irgendwo (UserDefault) und verwenden Sie neue Daten mit zwischengespeicherten Daten, um eine Entscheidung zu treffen (z. B. Benutzer benachrichtigen) Ich glaube, Sie brauchen genau dafür Hintergrund-Updates.
1-2 Sekunden oder weniger sind eine gute Zeit für Hintergrundaktualisierungen.
quelle