Как заставить приложение запускать 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 и части, играющей музыку, но не знаю точно, какой из них лучше всего подходит для моего случая, и как их реализовать.
Ответы
Ответ 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);
}
Надеюсь, это поможет вашему расследованию. Ура!