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.