Постоянный фоновый сервис iOS на основе отслеживания местоположения

В настоящее время я пишу приложение, которое зависит от отслеживания местоположения и отправки данных о местоположении на сервер. Проблема, однако, заключается в том, что он должен работать 24/7, и в настоящее время я испытываю случайные сбои, которые происходят каждые 2-3 дня. То, что я сделал, чтобы приложение работало постоянно в фоновом режиме, я поместил NSTimer в метод beginBackgroundTaskWithExpirationHandler прямо в метод applicationDidEnterBackground. Таймер срабатывает каждую минуту и ​​останавливает / запускает службу определения местоположения.

Вот пример журнала сбоев

Код в основном выглядит так:

UIApplication *app = [UIApplication sharedApplication];
__block UIBackgroundTaskIdentifier bgTaskId = 0;

bgTaskId = [app beginBackgroundTaskWithExpirationHandler:^{
    NSTimer *t = [NSTimer scheduledTimerWithTimeInterval: 1 * 60.0 target: self selector: @selector(onTick) userInfo: nil repeats: YES];
    [t fire];

    if (bgTaskId != UIBackgroundTaskInvalid){
        [app endBackgroundTask: bgTaskId];

        bgTaskId = UIBackgroundTaskInvalid;
    }
}];

Я использую GCDAsyncSockets для целей подключения, каждый вызов имеет время ожидания около 30 секунд.

У меня действительно нет идей, в чем может быть причина сбоев?

1 ответ

Ваш таймер, вероятно, срабатывает ПОСЛЕ того, как задача признана недействительной (после [UIApplication sharedApplication].backgroundTimeRemaining добирается до 0.

Дело в том, что вы не можете заставить приложение работать постоянно в фоновом режиме. Если вы хотите выполнять код время от времени, единственным вариантом будет использование API-интерфейса для определения местоположения в фоновом режиме, при этом в приложении указывается, что ваше приложение использует фоновый режим определения местоположения в своем списке. Вы бы получили CLLocationManagerDelegate обратные вызовы, и у вас есть некоторое время, чтобы выполнить некоторую работу при вызове этих методов.

См. Документацию Apple относительно фоновых режимов: http://developer.apple.com/library/ios/#DOCUMENTATION/iPhone/Conceptual/iPhoneOSProgrammingGuide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html

И руководство по локации: http://developer.apple.com/library/ios/#DOCUMENTATION/UserExperience/Conceptual/LocationAwarenessPG/Introduction/Introduction.html#//apple_ref/doc/uid/TP40009497

Другие вопросы по тегам