Постоянный фоновый сервис 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