Piszę aplikację, która wymaga aktualizacji lokalizacji w tle z dużą dokładnością i niską częstotliwością . Rozwiązaniem wydaje się być działające w tle zadanie NSTimer, które uruchamia aktualizacje menedżera lokalizacji, które następnie natychmiast się wyłączają. To pytanie zostało już zadane:
Jak uzyskać aktualizację lokalizacji w tle co n minut w mojej aplikacji na iOS?
Uzyskiwanie lokalizacji użytkownika co n minut po przejściu aplikacji w tło
iOS Nie jest to typowy problem z zegarem śledzenia lokalizacji w tle
Długo działający licznik czasu w tle w systemie iOS z trybem tła „lokalizacja”
Pełnoetatowa usługa iOS w tle oparta na śledzeniu lokalizacji
ale jeszcze nie uzyskałem minimalnego działającego przykładu . Po wypróbowaniu każdej permutacji powyższych zaakceptowanych odpowiedzi ustaliłem punkt wyjścia. Wejście w tło:
- (void)applicationDidEnterBackground:(UIApplication *)application
{
self.bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
NSLog(@"ending background task");
[[UIApplication sharedApplication] endBackgroundTask:self.bgTask];
self.bgTask = UIBackgroundTaskInvalid;
}];
self.timer = [NSTimer scheduledTimerWithTimeInterval:60
target:self.locationManager
selector:@selector(startUpdatingLocation)
userInfo:nil
repeats:YES];
}
i metoda delegata:
- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation {
NSLog(@"%@", newLocation);
NSLog(@"background time: %f", [UIApplication sharedApplication].backgroundTimeRemaining);
[self.locationManager stopUpdatingLocation];
}
Bieżące zachowanie polega na tym, że backgroundTimeRemaining
zmniejsza się od 180 sekund do zera (podczas rejestrowania lokalizacji), a następnie wykonuje procedurę obsługi wygaśnięcia i nie są generowane żadne dalsze aktualizacje lokalizacji. Jak zmodyfikować powyższy kod, aby otrzymywać okresowe aktualizacje lokalizacji w tle przez czas nieokreślony ?
Aktualizacja : Celuję w iOS 7 i wydaje się, że istnieją dowody na to, że zadania w tle zachowują się inaczej: