Как заставить мое приложение запускать NSTimer в фоновом режиме? - PullRequest
12 голосов
/ 10 февраля 2012

Я делаю тестовое приложение ТОЛЬКО для целей тестирования.Я не собираюсь идти в App Store.

Мне нужен мой NSTimer для продолжения работы в фоновом режиме с использованием UIBackgroundTaskIdentifier, сохранения данных в базу данных 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 и игре, исполняющей музыку, ноне знаю точно, какой из них лучше всего подойдет для моего случая, и как их реализовать.

Ответы [ 2 ]

37 голосов
/ 08 марта 2012

Я понял это самостоятельно, для всех, у кого была похожая проблема, я сначала включил флаг обновления местоположения в файле 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 голосов
/ 26 июня 2015

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);
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...