Mam aplikację, która musi zgłosić lokalizację użytkownika, nawet jeśli jest w tle lub nawet zabita (zakończona). Problem polega na tym, że aplikacja powinna zgłaszać lokalizację nie rzadziej niż co 1 godzinę.Okresowe aktualizacje lokalizacji w tle iOS, które zależy nie tylko od znaczącej zmiany lokalizacji
Używam znaczącej zmiany lokalizacji (SLC) do śledzenia wszystkich ruchów, która wystarcza, gdy użytkownik jest w drodze, ale gdy użytkownik przestaje, nie są zgłaszane żadne dalsze aktualizacje, a aplikacja nie ma możliwości przesłania nowej lokalizacji (podczas gdy użytkownik pozostaje w tym samym obszarze, ale bez SLC).
Aby obejść tę sprawę, zacznę używać pobrań tła, aby okresowo wysyłać aktualizacje lokalizacji w tle, nawet bez SLC). Problem polega na tym, że pobieranie tła działało dość często (co 20-30 minut, od kiedy użyłem go w innej aplikacji iOS 7.x), ale teraz z iOS8/iOS9 mogę je pobrać tylko raz dziennie, co jest nie do przyjęcia w moim przypadku. Wykonałem mnóstwo testów, opracowałem prostą aplikację pobierania w tle, która dodaje lokalne powiadomienie podczas pobierania. Nie ma szczęścia, by zmusić go do częstszej pracy.
Oto moja AppDelegate:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];
[application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound categories:nil]];
return YES;
}
- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
[[UIApplication sharedApplication] cancelAllLocalNotifications];
UILocalNotification *localNotification = [[UILocalNotification alloc] init];
NSDate *now = [NSDate date];
localNotification.fireDate = now;
localNotification.alertBody = [NSString stringWithFormat:@"Background fetch!"];
localNotification.soundName = UILocalNotificationDefaultSoundName;
NSInteger number = [UIApplication sharedApplication].applicationIconBadgeNumber;
number++;
localNotification.applicationIconBadgeNumber = number;
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
completionHandler(UIBackgroundFetchResultNewData);
}
Wszystko, co zostało zrobione tutaj jest dodanie lokalnego powiadomienia na każdym tle pobierania. Zawsze finalizuję wykonywanie w tle za pomocą UIBackgroundFetchResultNewData.
Czy mają Państwo jakieś sugestie, jak zmusić pobieranie tła do pracy częściej (lub udowodnić, że nie jest to już możliwe)? Wszelkie alternatywne rozwiązania spełniające moje wymagania są również mile widziane!
Tło pobieraniu nigdy nie miał gwarantowany okres wykonania. Sugeruję wysłanie cichego popychania do urządzenia, aby dać mu szansę na zgłoszenie lokalizacji, ale to nie zadziała, jeśli aplikacja zostanie zakończona. – Paulw11
To nigdy nie było gwarantowane, ale przynajmniej działało częściej. Czy były jakieś znaczące zmiany od czasu iOS 7 związane z pobierania tła? –
Jaką wartość powrócisz do obsługi zakończenia? Nowe dane lub brak nowych danych? Z mojego doświadczenia wynika, że nawet na iOS8 nie było wywoływane co 20-30 minut. – Paulw11