Dies ist der Abschnitt aus der CLLocationManager- Dokumentation, der das App-Verhalten mit startMonitoringSignificantLocationChanges beschreibt :
Wenn Sie diesen Dienst starten und Ihre Anwendung anschließend beendet wird, startet das System die Anwendung automatisch im Hintergrund neu, wenn ein neues Ereignis eintrifft. In diesem Fall enthält das an die Anwendung übergebene Optionswörterbuch: didFinishLaunchingWithOptions: Die Methode Ihres Anwendungsdelegierten enthält den Schlüssel UIApplicationLaunchOptionsLocationKey, der angibt, dass Ihre Anwendung aufgrund eines Standortereignisses gestartet wurde. Nach dem Neustart müssen Sie weiterhin ein Standortmanagerobjekt konfigurieren und diese Methode aufrufen, um weiterhin Standortereignisse zu empfangen. Wenn Sie die Ortungsdienste neu starten, wird das aktuelle Ereignis sofort an Ihren Delegaten übermittelt. Darüber hinaus wird die Location-Eigenschaft Ihres Location Manager-Objekts mit dem neuesten Location-Objekt gefüllt, noch bevor Sie Location Services starten.
Wenn Ihre App beendet wird (und ich gehe davon aus, dass Sie stopMonitoringSignificantLocationChanges nicht von applicationWillTerminate aus aufrufen ), werden Sie mit einem UIApplicationLaunchOptionsLocationKey- Parameter für application: didFinishLaunchingWithOptions geweckt . Zu diesem Zeitpunkt erstellen Sie Ihren CLLocationManager , rufen startMonitoringSignificantLocationChanges auf und führen die Verarbeitung Ihres Hintergrundstandorts für eine begrenzte Zeit durch . Also bin ich mit diesem Stück in Ordnung.
Der vorherige Absatz beschreibt nur, was passiert, wenn die App beendet wird. Er schlägt nicht vor, was Sie tun, wenn die Anwendung angehalten wird. In der Dokumentation zu didFinishLaunchingWithOptions heißt es:
Die Anwendung verfolgt Standortaktualisierungen im Hintergrund, wurde gelöscht und wurde jetzt neu gestartet. In diesem Fall enthält das Wörterbuch einen Schlüssel, der angibt, dass die Anwendung aufgrund eines neuen Standortereignisses neu gestartet wurde.
Es wird vorgeschlagen, dass Sie diesen Anruf erst erhalten, wenn Ihre App (aufgrund einer Standortänderung) nach Beendigung gestartet wird.
Der Absatz über den Dienst für wesentliche Änderungen im Programmierhandbuch zur Standortaufklärung enthält jedoch Folgendes:
Wenn Sie diesen Dienst laufen lassen und Ihre Anwendung anschließend angehalten oder beendet wird, aktiviert der Dienst Ihre Anwendung automatisch, wenn neue Standortdaten eintreffen. Zum Zeitpunkt des Aufwachens wird Ihre Anwendung in den Hintergrund gestellt und erhält eine kleine Zeitspanne für die Verarbeitung der Standortdaten. Da sich Ihre Anwendung im Hintergrund befindet, sollte sie nur minimale Arbeit leisten und alle Aufgaben (z. B. das Abfragen des Netzwerks) vermeiden, die möglicherweise verhindern, dass sie vor Ablauf der zugewiesenen Zeit zurückkehrt. Ist dies nicht der Fall, wird Ihre Anwendung möglicherweise beendet.
Dies deutet darauf hin, dass Sie mit Standortdaten geweckt werden, wenn Ihre App angehalten wurde, ohne jedoch zu erwähnen, wie Sie geweckt wurden:
- Erhält das UIApplicationDelegate einen Rückruf, der mir mitteilt, dass ich von einem angehaltenen Zustand in einen Hintergrundzustand übergehe ?
- Empfängt der Standortmanager (der gefroren war, als die App angehalten wurde) den StandortManager: didUpdateToLocation: fromLocation- Rückrufe?
- Muss ich nur Code in meine didUpdateToLocation- Nachricht implementieren , der den Anwendungsstatus überprüft und im Hintergrundmodus nur eine minimale Verarbeitung durchführt?
Während ich dies aufschreibe, denke ich, dass ich vielleicht gerade meine eigene Frage beantwortet habe, aber es wäre großartig, wenn mein Verständnis davon von jemandem bestätigt würde, der besser informiert ist.
quelle
didExitRegion
Rückruf, aber ich konnte nichtstartLocationUpdates
von dort, da es nicht durch App-Start war ...Mein Verständnis ist wie folgt (ich bin gerade dabei, eine Anwendung zu schreiben, die auf dieser API basiert, diese Komponente jedoch nicht ausreichend abgeschlossen hat, um mit dem Testen zu beginnen):
Obwohl das Betriebssystem im Hintergrund getötet wurde, wird Ihre Anwendung neu gestartet. Wenn Ihre Anwendung zur Änderung einfach vom Betriebssystem gestartet wird, erhalten Sie einen Aufruf der Anwendung didFinishLaunchingWithOptions :
hilft Ihnen festzustellen, ob Sie von einer Änderung des Hintergrundstandorts zurückgekehrt sind.
Unabhängig davon, wie es passiert ist, müssen Sie beim Neustart Ihrer Anwendung (es sei denn, sie wurde aufgrund einer Hintergrundaufgabe noch im Hintergrund ausgeführt und die Aufgabe hat begonnen, Änderungen zu überwachen) explizit anweisen , dass sieMonitoringSignificantLocationChanges erneut starten soll , da der Rückruf Nein lautet länger angebracht nach "Gefriertrocknung". Und ja, Sie müssen nur Code in didUpdateToLocation implementieren, sobald Sie einen Standort-Handler erneut angehängt haben, sobald Sie aus dem angehaltenen Zustand zurückgekehrt sind.Dies ist, was ich gerade mit meiner Code-Entwicklung mache. Wie ich bereits erwähnt habe, bin ich noch nicht bereit, dies auf einem Gerät zu testen. Daher kann ich nicht sagen, ob ich alles richtig interpretiert habe. Kommentatoren, bitte zögern Sie nicht, mich zu korrigieren Thema).
Oh, und wenn Sie durch einen Pechstrich eine App veröffentlichen, die das tut, was ich will, könnte ich weinen :)
Viel Glück!
quelle
Wenn die Anwendung aufgrund eines Standortwechsels aus dem angehaltenen Zustand aufgerufen wird, wird die Anwendung im Hintergrundzustand gestartet.
Alle Objekte sind live und Sie erhalten eine Standortaktualisierung im vorhandenen Delegaten.
quelle