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 местоположения фона, установив, что ваше приложение использует фоновый режим местоположения в своем plist.
Вы будете получать обратные вызовы CLLocationManagerDelegate
, и у вас есть время, чтобы выполнить некоторую работу при вызове этих методов.
См. документацию Apple относительно фоновых режимов: http://developer.apple.com/library/ios/#DOCUMENTATION/iPhone/Conceptual/iPhoneOSProgrammingGuide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html
И руководство по местоположению-awarness: http://developer.apple.com/library/ios/#DOCUMENTATION/UserExperience/Conceptual/LocationAwarenessPG/Introduction/Introduction.html#//apple_ref/doc/uid/TP40009497