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:

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.

War es hilfreich?

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):

  1. 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.
  2. Wenn Ihre Anwendung auf den Hintergrund gestellt wird, wird UIApplication erhalten applicationWillResignActive , gefolgt von applicationDidEnterBackground .
  3. 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.
  4. 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.

  5. 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 .
  6. 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top