Verhalten für signifikante Änderung Standort API wenn beendet / suspendiert?
-
26-09-2019 - |
Frage
Dies ist der Abschnitt von der CLLocationManager Dokumentation des App Verhalten mit startMonitoringSignificantLocationChanges :
Wenn Sie diesen Dienst starten und Anwendung ist anschließend beendet, das System automatisch relauncht die Anwendung in der Hintergrund, wenn ein neues Ereignis eintrifft. Im In einem solchen Fall werden die Optionen dictionary auf den übergebenen Anwendung: didFinishLaunchingWithOptions: Methode Ihrer Anwendung delegieren enthält den Schlüssel UIApplicationLaunchOptionsLocationKey um anzuzeigen, dass Ihre Anwendung war wegen einer Lage Veranstaltung ins Leben gerufen. Nach dem Relaunch, müssen Sie noch ein Standort-Manager-Objekt konfigurieren und rufen Sie diese Methode, um fortzufahren Empfangsort Veranstaltungen. Wenn du Neustart Ortungsdienste, die aktuellen Veranstaltung richtet sich an Ihre Stellvertretung geliefert sofort. Darüber hinaus ist die Lage Eigentum von Ihrem Standort-Manager Objekt wird mit der am dichtesten besiedelten aktuelles Standortobjekt, noch bevor Sie Start Ortungsdienste.
Also mein Verständnis ist, dass wenn Ihre Anwendung beendet (und ich nehme an, wenn Sie nicht nennen? stopMonitoringSignificantLocationChanges von applicationWillTerminate ) Sie erhalten mit einem UIApplicationLaunchOptionsLocationKey Parameter Anwendung: didFinishLaunchingWithOptions . An diesem Punkt erstellen Sie Ihre CLLocationManager , Anruf startMonitoringSignificantLocationChanges und tun Sie Ihre Hintergrund Lokalisierungsverarbeitung für eine begrenzte Zeit . Also ich bin gut mit diesem Bit.
Der bisherige Absatz nur spricht über das, was passiert, wenn der App beendet wird, legt nahe, es nicht das, was Sie tun, wenn die Anwendung angehalten wird. Die Dokumentation für didFinishLaunchingWithOptions sagt:
Die Anwendung verfolgt Standort Updates im Hintergrund, wurde ausgespült, und wird nun neu aufgelegt worden. In diesem Fall enthält das Wörterbuch eine Schlüssel darauf hinweist, dass die Anwendung war wegen einer neuen Position neu aufgelegt Ereignis.
Vorschlagen, dass Sie nur diesen Anruf erhalten, wenn Ihre Anwendung (wegen einer Standortwechsel) gestartet wird, nachdem Sie beendet haben.
Doch der Absatz auf dem Signifikante Änderungsdienst in der Location Awareness Programmieranleitung folgendes zu sagen hat:
Wenn Sie diesen Dienst laufen lassen und anschließend Ihre Anwendung suspendiert oder beendet wird, der Dienst automatisch aufwacht Ihre Anwendung, wenn neue Standortdaten ankommt. Bei Aufwachzeit, Ihre Anwendung in den Hintergrund und eine geringe Menge an Zeit gegeben verarbeiten, um die Standortdaten. weil Ihre Anwendung ist im Hintergrund, es sollte minimal Arbeit und vermeiden Sie tun Alle Aufgaben, (wie beispielsweise die Abfrage Netzwerk), die verhindern, könnte es aus Rückkehr vor der zugewiesenen Zeit läuft ab. Wenn dies nicht der Fall, Ihre Anwendung kann beendet werden.
Dies legt nahe, Sie mit Standortdaten aufgeweckt werden, wenn Ihre Anwendung ausgesetzt wurde, aber nicht zu erwähnen, wie Sie aufgeweckt:
- Ist die UIApplicationDelegate erhält einen Rückruf mir zu sagen, dass ich von einem suspendierten Zustand in einen Hintergrundzustand bin wieder aufnehmen?
- Ist der Aufnahmeleiter (die getrocknet wurde eingefroren, wenn die App suspendiert) starten Locationmanager: didUpdateToLocation: fromLocation Rückrufe?
- Muss ich nur Code implementieren in meinem , wenn im Hintergrundmodus didUpdateToLocation Nachricht, die überprüft die Anwendungszustand und minimale Verarbeitung tut?
Bei dem Verfahren dieses bis zu schreiben, ich glaube, ich meine eigene Frage gerade beantwortet haben, aber es wäre toll, mein Verständnis für diese von jemand mehr Wissen bestätigt zu haben.
Lösung
Da ich diese Frage gestellt, ich habe ein gutes Stück von Tests durchgeführt (meist im Zuge zwischen Wohnung und Arbeit) und bestätigt habe, dass das Verhalten für abgehängte Anwendungen ist, wie ich am Ende der Frage vermutet.
Das heißt, Ihre suspendierte App aufgeweckt, Sie keine Rückrufe auf AppDelegate erhalten, stattdessen erhalten Sie Ihr Standort-Updates über die vorhandenen CLLocationManagerDelegate . Sie können feststellen, dass Sie durch Prüfen der im Hintergrund laufen applicationState , und tun beschränkte Arbeit für den Fall, dass Sie von einem suspendierten Zustand aufgeweckt werden die Ortungsverarbeitung zu tun.
[UIApplication sharedApplication].applicationState == UIApplicationStateBackground
Ich kam zu diesem Schluss, mit einem Standort Test-Harnisch, dass Sie willkommen zu herunterladen und auszuprobieren. Es ist eine ziemlich einfache Anwendung, die Sie auf signifikante Änderung und GPS Änderung APIs über die Benutzeroberfläche und melden Sie sich alle die Antworten, die Sie zurück zu drehen erlaubt.
N. B. Punkt sechs in der vorherige Antwort ist nicht korrekt. gefriergetrocknete suspendiert Apps erhalte CLLocationManagerDelegate Rückrufe, wenn sie von einem aufgehängten Zustand aufgeweckt.
Andere Tipps
Mein Verständnis ist, wie folgt (ich dabei bin, eine Anwendung zu schreiben, die auf dieser API beruht, sondern haben diese Komponente nicht genug abgeschlossen starten Prüfung):
- Ihre Anwendung zum ersten Mal ausführen, registrieren Sie auf startMonitoringSignificantLocationChanges und bieten eine Callback-Funktion. Während die Anwendung ausgeführt wird, wird es diesen Rückruf nennen, wenn es eine wesentliche Änderung erhält.
- Wenn Ihre Anwendung auf den Hintergrund gestellt wird, wird UIApplication erhalten applicationWillResignActive , gefolgt von applicationDidEnterBackground .
- Wenn Ihre Anwendung getötet wird, während es im Hintergrund aufgehängt ist, werden Sie nicht benachrichtigt werden; jedoch, wenn Ihre Anwendung getötet wird, während es (im Vordergrund oder Hintergrund meines Wissens) ausgeführt wird, werden Sie einen Moment Zeit bekommen mit applicationWillTerminate . Sie können nicht verlangen, zusätzliche Hintergrund Zeit von dieser Funktion.
-
Trotz im Hintergrund getötet zu werden, wird das O der Anwendung neu starten. Wenn Ihre Anwendung einfach durch das Betriebssystem für eine Änderung gestartet wird, erhalten Sie einen Anruf auf Anwendung didFinishLaunchingWithOptions erhalten :
if ([launchOptions objectForKey:UIApplicationLaunchOptionsLocationKey])
wird Ihnen helfen, festzustellen, ob Sie es von einem Hintergrund Standortwechsel zurück.
- Wenn stattdessen Sie wurden zur Zeit im Hintergrund laufen, und Ihre Anwendung wird vom Benutzer manuell neu gestartet werden Sie ein erhalten applicationWillEnterForeground , gefolgt von applicationDidBecomeActive .
-
Unabhängig davon, wie es passiert ist, wenn die Anwendung neu gestartet wird (es sei denn, es noch im Hintergrund als Ergebnis einer Hintergrundaufgabe ausgeführt wird und die Aufgabe Überwachung von Änderungen begonnen hatte), müssen Sie es explizit sagen, < strong> startMonitoringSignificantLocationChanges wieder, da der Rückruf ist nicht mehr angebracht, nachdem „Gefriertrocknung.“ Und ja, man muss nur Code in didUpdateToLocation implementieren, sobald Sie einmal wieder kommt aus dem unterbrochenen Zustand einen Standort Handler irgendeine Art wieder angebracht haben.
Das ist, was ich mit meinem Code-Entwicklung jetzt. Wie ich schon erwähnt, bin ich nicht ganz bereit, dies auf einem Gerät zu testen, so kann ich nicht sagen, ob ich alles richtig interpretiert habe, so commenters, zögern Sie nicht, mich zu korrigieren (obwohl ich wesentliche Lesung auf dem getan habe Thema).
Ach ja, und wenn durch ein Pech, Sie eine App veröffentlichen, die tun, was ich will meine tun, ich könnte weinen:)
Viel Glück!
Wenn die Anwendung von suspendierten Zustand als Folge des Standortwechsel Anwendung hervorgerufen wird, wird im Hintergrund Zustand starten.
Alle Objekte werden live und werden Sie Standortaktualisierung in den Delegierten empfangen.