Когда вызывается `applicationWillTerminate(_:)` в iOS?

«Когда вызывается `applicationWillTerminate(_:)` в iOS?» — вопрос из категории UIKit, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Метод applicationWillTerminate(_:) делегата приложения вызывается, когда система полностью завершает работу приложения, а не просто переводит его в фоновый режим.

Типичные сценарии вызова:

  • Пользователь убивает приложение из списка многозадачности.
  • Система завершает приложение для освобождения ресурсов, и оно не находилось в приостановленном (suspended) состоянии.

Когда метод НЕ вызывается:

  • При переходе в фоновый режим (для этого есть applicationDidEnterBackground).
  • При падении (crash) приложения.
  • При принудительном завершении (force kill) из Xcode или во время отладки.
  • При перезагрузке устройства.

Ограничения и best practices:

  • На выполнение метода дается примерно 5 секунд. По истечении этого времени процесс убивается.
  • В современных iOS (начиная с ~iOS 13) система редко вызывает этот метод, предпочитая приостанавливать приложения. Не полагайтесь на него для критически важных операций.
  • Для гарантированного сохранения состояния используйте applicationDidEnterBackground(_:).

Пример использования:

func applicationWillTerminate(_ application: UIApplication) {
    // Сохранение последних изменений данных пользователя
    DataManager.shared.saveContext()
    // Закрытие сетевых соединений
    NetworkClient.shared.cleanup()
}