2015-09-20 128 views
8

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!

+1

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

+0

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? –

+1

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

Odpowiedz

4

Okazało się, że pobieranie tła w iOS zależy w dużej mierze od tego, co robisz w programie obsługi, w szczególności od aktywności w sieci. Oto lista zależnościami, które należy wziąć pod uwagę starając się zrozumieć, czy i jak często iOS będzie wykonywał swoje pobrać:

  • czasu spędzasz w przewodnika
  • wynik (kod NODATA, NewData)
  • obsługi błędów (będziesz zostać uruchomiona mniej prawdopodobne, jeśli kod awarii
  • limity czasu (Twój wykonanie kodu może zostać przerwany przez iOS)
  • zużycie energii aktywność
  • sieć odniesione na wynik (trzeba zrobić żądania sieciowego podczas mówiąc t Kapelusz masz NewData, w przeciwnym razie pobieranie może być wykonane następnym razem w ciągu dnia lub tak nigdy.

aplikacji, które pobierają niewielkie ilości treści szybko i dokładnie odzwierciedlają gdy mieli treść dostępna do pobrania, jest bardziej prawdopodobne, otrzymywać czas wykonania w przyszłości niż aplikacjach, które wymagają długiego czasu, aby pobrać ich treść lub , że treść roszczenia była dostępna , ale potem niczego nie pobieraj.

Ostatnia pozycja okazała się kluczowa w moim przypadku, ponieważ dla celów testowych oświadczyłem sciaga i nigdy nie próbował nic ściągać. Po rozpoczęciu korzystania z sieci w module obsługi pobieranie tła działa zgodnie z oczekiwaniami co 15-30 minut.

Jabłko docs: https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html

Powiązane problemy