Можем ли мы установить таймер в методе -applicationWillTerminate? - PullRequest
1 голос
/ 09 декабря 2011

У меня есть приложение, которое извлекает данные с веб-страницы и заполняет их в UITableView.Я вижу, что мое приложение не закрывается даже после долгого времени после нажатия кнопки домой.Я понимаю, что если у телефона было мало памяти, ОС убьет приложение.Я не хочу делать «Добавить ключ -> Приложение не работает в фоновом режиме» в pinfo.Я хотел бы, чтобы приложение поддерживало состояние в течение некоторого времени.Мне было интересно, можем ли мы установить таймер в методе - (void)applicationWillTerminate:(UIApplication *)application{}, чтобы приложение могло завершить работу, если оно неактивно, например, в течение 1 часа, и перезапустить.

Спасибо.

Ответы [ 2 ]

3 голосов
/ 09 декабря 2011

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

Это вызовы, которые вы получите сейчас (многозадачность):

// User taps your app icon first launch
application:didFinishLaunchingWithOptions:
applicationDidBecomeActive:

// User pushes home button
applicationWillResignActive:
applicationDidEnterBackground:

// User selects your app again
applicationWillEnterForeground:
applicationDidBecomeActive:

Если вы установите клавишу Application does not run in background на YES, ИЛИ, если ваше устройство не поддерживает многозадачность (например, iPod touch 2nd Gen), то точно такие же действия вызовут эти методы.

// User taps your app icon first launch
application:didFinishLaunchingWithOptions:
applicationDidBecomeActive:

// User pushes home button
applicationDidEnterBackground:
applicationWillTerminate:

// User selects your app again
application:didFinishLaunchingWithOptions:
applicationDidBecomeActive:

Обратите внимание, что если ОС решит убить ваше приложение за память, она не разбудит вас только для того, чтобы убить вас, вы никогда не гарантированно получите вызов applicationWillTerminate:.

Я могу придумать две причины для вашего вопроса:

1) Вы хотите сохранить состояние и хотите сделать это в applicationWillTerminate:, но это не вызывается. Если это так, я бы предложил сохранить состояние в applicationDidEnterBackground:, поскольку оно вызывается в обоих случаях, когда пользователь нажимает кнопку возврата домой.

2) Вы хотели перезагрузить данные, если приложение неактивно в течение определенного периода времени. В этом случае сохраните текущее время в течение applicationDidEnterBackground: и проверьте, сколько времени прошло в applicationDidBecomeActive:, и при необходимости перезагрузите.

1 голос
/ 09 декабря 2011

Когда ваше приложение переходит в фоновый режим, вы можете запросить дополнительное время (думаю, до 500 секунд?), Чтобы завершить какое-то долгосрочное задание (см. -beginBackgroundTaskWithExpirationHandler: из UIApplication). Но вы никогда не можете запланировать, чтобы ваше приложение "просыпалось" или перезагружалось после того, как оно было завершено.

Существуют определенные исключения из этого правила для приложений, которые отслеживают местоположение пользователя или которым необходимо принимать входящие вызовы VOIP. См. Фоновое выполнение и многозадачность раздела Руководства по программированию приложения для iOS, если ваше приложение соответствует требованиям.

...