Подтвердить что ты не робот

Как заставить приложение запускать NSTimer в фоновом режиме?

Я делаю тестовое приложение только для целей тестирования. Я не собираюсь это идти в App Store.

Мне нужно, чтобы мой NSTimer продолжал работать в фоновом режиме с помощью UIBackgroundTaskIdentifier, сохранял данные в db Core Data и, наконец, выталкивал данные на сервер (я использую Parse) через определенный промежуток времени, конечно.

В основном, я не нашел вопросов, которые касаются моего конкретного случая. Я установил свой NSTimer так:

    UIBackgroundTaskIdentifier bgTask;
UIApplication  *app = [UIApplication sharedApplication];
bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
    [app endBackgroundTask:bgTask]; 
}];

self.timer = [NSTimer scheduledTimerWithTimeInterval:self.localInterval target:self selector:@selector(updateCoreData:) userInfo:nil repeats:YES];

метод updateCoreData просто вызывает класс Core Data и делает необходимые вставки.

Я читал о VoIP и части, играющей музыку, но не знаю точно, какой из них лучше всего подходит для моего случая, и как их реализовать.

4b9b3361

Ответ 1

Я понял это сам, для кого-то другого с подобной проблемой, что я сделал, это сначала включить флаг обновления местоположения в вашем файле Info.plist. Чтобы сделать это, вы должны добавить Ключ, называемый "Необходимые фоновые режимы" на Xcode 4, затем в качестве значения выберите "Регистры приложений для обновлений местоположения"

У меня есть таймер, объявленный таким образом в моем файле .h:

NSTimer *silenceTimer;
@property (nonatomic, retain) NSTimer *silenceTimer;

Затем в файле .m я объявил его так:

UIBackgroundTaskIdentifier bgTask;
UIApplication  *app = [UIApplication sharedApplication];
bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
    [app endBackgroundTask:bgTask]; 
}];
self.silenceTimer = [NSTimer scheduledTimerWithTimeInterval:300 target:self
selector:@selector(startLocationServices) userInfo:nil repeats:YES];

Наконец, по методу выбора я сделал следующее:

-(void)startLocationServices {
    [locationManager startUpdatingLocation];
    [locationManager stopUpdatingLocation];
}

Это создаст таймер, который запустит и немедленно остановит службы определения местоположения через 5 минут. Этого будет достаточно для того, чтобы приложение оставалось в живых неопределенно, если только вы не убьете процесс.

Ответ 2

XCode 6.3.1 для iOS 8.3

Существуют большие различия, с которыми я столкнулся между приложениями. поведение при подключении к Mac с помощью XCode с помощью отладчика и тех же приложений. поведение при отключении.

В текущей версии iOS, 8.3, самое большее ваше приложение выделено на 180 секунд для запуска в фоновом режиме для конечной долговременной задачи с обработчиком истечения срока.

Независимо от того, что вы пытаетесь, при отключенном телефоне ваше приложение будет уничтожено системой за 180 секунд или раньше. Для этого я сделал много испытаний и трюков. Смотрите мой пост...

Мой пост NSTimer

Вот аккуратный способ сказать, сколько времени осталось для вашего приложения для запуска до завершения, помните, что на этот раз вам не гарантировано.

NSTimeInterval backgroundTimeRemaining = [[UIApplication sharedApplication] backgroundTimeRemaining];

if (backgroundTimeRemaining == DBL_MAX)
{
    NSLog(@"background time remaining = undetermined");
}
else
{
    NSLog(@"background time remaining = %0.2f sec.", backgroundTimeRemaining);
}

Надеюсь, это поможет вашему расследованию. Ура!