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