To jest sekcja z dokumentacji CLLocationManager opisująca zachowanie aplikacji za pomocą startMonitoringSsequantLocationChanges :
Jeśli uruchomisz tę usługę, a aplikacja zostanie następnie zamknięta, system automatycznie uruchomi ponownie aplikację w tle, jeśli nadejdzie nowe zdarzenie. W takim przypadku słownik opcji przekazany do aplikacji: didFinishLaunchingWithOptions: metoda delegata aplikacji zawiera klucz UIApplicationLaunchOptionsLocationKey wskazujący, że aplikacja została uruchomiona z powodu zdarzenia lokalizacji. Po ponownym uruchomieniu należy nadal skonfigurować obiekt menedżera lokalizacji i wywołać tę metodę, aby kontynuować odbieranie zdarzeń dotyczących lokalizacji. Po ponownym uruchomieniu usług lokalizacyjnych bieżące zdarzenie jest natychmiast dostarczane do pełnomocnika. Ponadto właściwość lokalizacji obiektu menedżera lokalizacji jest wypełniana najnowszym obiektem lokalizacji, jeszcze przed uruchomieniem usług lokalizacyjnych.
Rozumiem więc, że jeśli Twoja aplikacja zakończy działanie (i zakładam, że jeśli nie wywołasz stopMonitoringSsequantLocationChanges z applicationWillTerminate ), zostaniesz obudzony parametrem UIApplicationLaunchOptionsLocationKey do application: didFinishLaunchingWithOptions . W tym momencie tworzysz swój CLLocationManager , wywołujesz startMonitoringSsequantLocationChanges i przez ograniczony czas wykonujesz przetwarzanie lokalizacji w tle . Więc jestem w porządku z tym kawałkiem.
Poprzedni akapit mówi tylko o tym, co się dzieje, gdy aplikacja zostanie zamknięta, nie sugeruje, co zrobić, gdy aplikacja jest zawieszona. Dokumentacja didFinishLaunchingWithOptions mówi:
Aplikacja śledzi aktualizacje lokalizacji w tle, została wyczyszczona, a teraz została ponownie uruchomiona. W tym przypadku słownik zawiera klucz wskazujący, że aplikacja została ponownie uruchomiona z powodu nowego zdarzenia lokalizacji.
Sugeruje, że połączenie to zostanie odebrane dopiero po uruchomieniu aplikacji (z powodu zmiany lokalizacji) po rozwiązaniu.
Jednak akapit dotyczący usługi znaczących zmian w Przewodniku programowania rozpoznawania lokalizacji zawiera następujące informacje:
Jeśli pozostawisz tę usługę uruchomioną, a aplikacja zostanie następnie zawieszona lub zakończona, usługa automatycznie obudzi aplikację po nadejściu nowych danych o lokalizacji. W momencie budzenia aplikacja jest umieszczana w tle i ma niewielką ilość czasu na przetworzenie danych o lokalizacji. Ponieważ aplikacja działa w tle, powinna wykonywać minimalną pracę i unikać wszelkich zadań (takich jak wysyłanie zapytań do sieci), które mogłyby uniemożliwić jej powrót przed upływem przydzielonego czasu. Jeśli tak się nie stanie, Twoja aplikacja może zostać zamknięta.
Sugeruje to, że budzisz się z danymi o lokalizacji, jeśli Twoja aplikacja została zawieszona, ale nie wspomina o tym, jak się budzisz:
- Czy UIApplicationDelegate otrzymuje wywołanie zwrotne z informacją, że wznawiam stan zawieszenia do stanu tła?
- Czy menedżer lokalizacji (który został liofilizowany, gdy aplikacja została zawieszona) zaczyna odbierać wywołania zwrotne locationManager: didUpdateToLocation: fromLocation ?
- Czy muszę po prostu zaimplementować kod w mojej wiadomości didUpdateToLocation, która sprawdza stan aplikacji i wykonuje minimalne przetwarzanie, jeśli działa w tle?
W trakcie pisania tego, myślę, że mogłem właśnie odpowiedzieć na moje własne pytanie, ale byłoby wspaniale, gdyby moje zrozumienie tego zostało potwierdzone przez kogoś bardziej kompetentnego.
źródło
didExitRegion
oddzwanianie, ale nie mogłemstartLocationUpdates
stamtąd, ponieważ nie było to przez uruchomienie aplikacji ...Moje rozumienie jest następujące (jestem w trakcie pisania aplikacji, która opiera się na tym API, ale nie ukończyłem tego komponentu na tyle, aby rozpocząć testowanie):
Pomimo tego, że zostanie zabity w tle, system operacyjny ponownie uruchomi Twoją aplikację. Jeśli Twoja aplikacja jest po prostu uruchamiana przez system operacyjny dla zmiany, otrzymasz wezwanie do application didFinishLaunchingWithOptions :
pomoże Ci określić, czy wróciłeś ze zmiany lokalizacji w tle.
Niezależnie od tego, jak to się stało, po ponownym uruchomieniu aplikacji (chyba że nadal działała w tle w wyniku zadania w tle, a wspomniane zadanie zaczęło monitorować zmiany), musisz wyraźnie powiedzieć jej, aby ponownie uruchomiłaMonitoringSsequantLocationChanges, ponieważ wywołanie zwrotne nie jest dłużej przyczepiony po „liofilizacji”. I tak, wystarczy zaimplementować kod w didUpdateToLocation po ponownym podłączeniu pewnego rodzaju programu obsługi lokalizacji po powrocie ze stanu zawieszenia.Właśnie tym zajmuję się teraz przy tworzeniu mojego kodu. Jak wspomniałem wcześniej, nie jestem jeszcze gotowy, aby przetestować to na urządzeniu, więc nie mogę stwierdzić, czy wszystko poprawnie zinterpretowałem, więc komentatorzy, zachęcam do poprawiania mnie (chociaż zrobiłem znaczną lekturę na temat).
Aha, a jeśli jakimś pechem wypuścisz aplikację, która robi to, co chcę, mógłbym płakać :)
Powodzenia!
źródło
Jeśli aplikacja zostanie wywołana ze stanu zawieszenia w wyniku zmiany lokalizacji, aplikacja uruchomi się w tle.
Wszystkie obiekty będą aktywne i otrzymasz aktualizację lokalizacji w obecnym delegacie.
źródło