applicationWillEnterForeground против applicationDidBecomeActive, applicationWillResignActive vs. applicationDidEnterBackground

Какой надлежащий делегат реализовать, когда приложение пробуждается из-за того, что оно находится в фоновом режиме, и вы хотите, чтобы он подготовил его к активному?

applicationWillEnterForeground vs applicationDidBecomeActive – В чем разница?

Каков надлежащий делегат для реализации, когда приложение собирается спать, и вы хотите подготовить его для очистки и сохранения данных?

applicationWillResignActive vs. applicationDidEnterBackground – В чем разница?

Кроме того, я заметил, что applicationWillResignActive вызывается при поступлении входящего SMS или звонка, но пользователь выбирает нажать «ОК» и продолжить. Я не хочу, чтобы мое приложение предпринимало какие-либо действия в этих случаях. Я просто хочу, чтобы он продолжал работать без промежуточной очистки, так как пользователь не выходил из приложения. Итак, я думаю, что имеет смысл делать очистку только в applicationDidEnterBackground.

Я был бы признателен за ваш вклад в лучшие практики, чтобы следить за тем, какие delegates должны выполнять для пробуждения и сна, а также для рассмотрения таких событий, как прерывание SMS / звонков.

благодаря

При пробуждении, т.е. перезагрузка приложения (либо через трамплин, приложение или URL) applicationWillEnterForeground: вызывается. Он выполняется только один раз, когда приложение становится готовым к использованию, после его ввода в фоновом режиме, а applicationDidBecomeActive: может быть вызвано несколько раз после запуска. Это делает applicationWillEnterForeground: идеально подходит для настройки, которая должна произойти только один раз после перезапуска.

applicationWillEnterForeground: называется:

  • когда приложение перезаписано
  • перед applicationDidBecomeActive:

applicationDidBecomeActive: вызывается:

  • когда приложение запускается после application:didFinishLaunchingWithOptions:
  • после applicationWillEnterForeground: если URL не обрабатывается.
  • после application:handleOpenURL: вызывается.
  • после applicationWillResignActive: если пользователь игнорирует прерывание, например, телефонный звонок или SMS.

applicationWillResignActive: вызывается:

  • когда происходит прерывание, такое как телефонный звонок.
    • если пользователь принимает вызов applicationDidEnterBackground: вызывается.
    • если пользователь игнорирует вызов applicationDidBecomeActive: вызывается.
  • когда нажата кнопка «Домой» или пользователь переключает приложения.
  • docs говорят, что вы должны
    • приостанавливать текущие задачи
    • отключать таймеры
    • приостановить игру
    • снизить частоту кадров OpenGL

applicationDidEnterBackground: называется:

  • после applicationWillResignActive:
  • docs говорят, что вы должны:
    • освободить общие ресурсы
    • сохранять данные пользователя
    • аннулировать таймеры
    • сохраните состояние приложения, чтобы восстановить его, если приложение завершено.
    • отключить обновления пользовательского интерфейса
  • у вас есть 5 секунд, чтобы сделать то, что вам нужно, и вернуть метод
    • если вы не вернетесь в течение ~ 5 секунд, приложение будет прекращено.
    • вы можете попросить больше времени с beginBackgroundTaskWithExpirationHandler:

Официальная документация.

Этот документ Apple полезен для ваших вопросов. Для быстрой концепции вы можете увидеть Рисунок 3-1 в этом документе. Вы также можете прочитать комментарий из кода, сгенерированного мастером XCode. Перечислены следующим образом:

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. return YES; } - (void)applicationWillResignActive:(UIApplication *)application { /* Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. */ } - (void)applicationDidEnterBackground:(UIApplication *)application { /* Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. */ } - (void)applicationWillEnterForeground:(UIApplication *)application { /* Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. */ } - (void)applicationDidBecomeActive:(UIApplication *)application { /* Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. */ } - (void)applicationWillTerminate:(UIApplication *)application { /* Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. */ } 

В приведенном выше коде только запуск приложения у вас есть возможность сказать «ДА» или «НЕТ», а другие – только уведомления. Другими словами, у вас нет способа заставить пользователей пренебрегать входящим вызовом или SMS с помощью приведенного выше кода. Не знаю, есть ли другой способ обхода проблемы.

Я все еще немного смутился с ответом Дано, поэтому я сделал небольшой тест, чтобы получить stream событий в определенных сценариях для моей справки, но это может быть полезно и вам. Это для приложений, которые НЕ используют UIApplicationExitsOnSuspend в своем info.plist. Это было выполнено на симуляторе iOS 8 +, подтвержденном устройством iOS 7. Пожалуйста, извините имена обработчиков событий Xamarin. Они очень похожи.

  • Начальный и все последующие запуски из нерабочего состояния:

FinishedLaunching

OnActivated

  • Прерывание (телефонный звонок, верхний слайд-вниз, нижний слайд вверх):
  • Кнопка «Домой» с двойным нажатием приводит список неактивных приложений, а затем повторно выбирает наше приложение:

OnResignActivation


OnActivated

  • Кнопка «Домой» с двойным нажатием включает список неактивных приложений, выбор другого приложения, а затем перезапуск нашего приложения:
  • Нажмите кнопку «Одно нажатие», затем перезапустите:
  • Блокировка (кнопка включения / выключения), затем разблокировка:

OnResignActivation

DidEnterBackground


WillEnterForeground

OnActivated

  • Главная кнопка двойного нажатия, и прекратите наше приложение: (последующая перезагрузка – это первый случай)

OnResignActivation

DidEnterBackground

DidEnterBackground (только для iOS 7?)

Да, DidEnterBackground вызывается дважды на устройстве iOS7. В обоих случаях состояние UIApplication является Background. Однако симулятор iOS 8 этого не делает. Это требует тестирования на устройстве iOS 8. Я уточню свой ответ, когда я получу свою руку, или кто-то еще сможет подтвердить это.

applicationWillEnterForeground называется:

когда приложение перезагружается (происходит от фона до переднего плана) Этот метод не вызывается, когда приложение запускается в первый раз, т.е. когда вызывается applicationDidFinishLaunch но только когда оно происходит из фонового applicationDidBecomeActive

applicationDidBecomeActive вызывается

когда приложение сначала запускается после того, как didFinishLaunching после applicationWillEnterForeground если нет URL-адреса для обработки. после application:handleOpenURL: вызывается. после applicationWillResignActive если пользователь игнорирует прерывание, например, телефонный звонок или SMS. после исчезновения alertView в любом месте приложения

В iOS 8+ есть тонкая, но важная разница для телефонного звонка.

В iOS 7, если пользователь делает телефонный звонок, вызываются как applicationWillResignActive: так и applicationDidEnterBackground:. Но в iOS 8+ вызывается только applicationWillResignActive:.

applicationWillResignActive вызывается, когда система запрашивает разрешения. (в iOS 10). На всякий случай кто-то попал в ту же беду, что и я …

  • Формирование портретной ориентации при нажатии на альбомный режим.
  • Как добавить 1 день к NSDate?
  • Передача параметров addTarget: действие: forControlEvents
  • Как кодировать Base64 на iPhone
  • Программно включить Bluetooth в iphone sdk?
  • Свойства IBOutlet не обновляются при использовании метода prepareForSegue
  • Почему NSError нуждается в двойной косвенности? (указатель на указатель)
  • Ошибка модуля сборки iOS8 для Facebook для FBSDKCoreKit
  • Координаты текстуры OpenGL в пиксельном пространстве
  • Получить текущего первого ответчика без использования частного API
  • Ошибка: протокол недоступен, сброс backtrace
  • Давайте будем гением компьютера.