Что такое жизненный цикл iOS-приложения и какие у него состояния?

Ответ

Жизненный цикл (App Lifecycle) — это последовательность состояний, через которые проходит приложение от запуска до завершения. Управление им необходимо для правильного распределения ресурсов и реакции на действия пользователя/системы.

Основные состояния:

  1. Not Running: Приложение не запущено.
  2. Inactive (Неактивное): Приложение на переднем плане (foreground), но не обрабатывает события (например, во время входящего звонка или показа системного алерта). Кратковременное состояние.
  3. Active (Активное): Приложение на переднем плане и получает события. Нормальный режим работы.
  4. Background (Фоновое): Приложение находится на заднем плане, но может выполнять код (например, завершить загрузку, обновить геопозицию). Время выполнения ограничено.
  5. Suspended (Приостановленное): Приложение находится в фоне, но код не выполняется. Состояние процесса и память сохраняются. Система может автоматически завершить приложение в этом состоянии для освобождения ресурсов.

Управление через AppDelegate (без сцен, до iOS 13):

// Запуск приложения
func application(_:didFinishLaunchingWithOptions:) -> Bool

// Переходы между состояниями
func applicationWillResignActive(_:) // Active -> Inactive
func applicationDidBecomeActive(_:)  // Inactive -> Active
func applicationDidEnterBackground(_:) // Inactive -> Background
func applicationWillEnterForeground(_:) // Background -> Inactive
func applicationWillTerminate(_:) // Завершение (может не вызваться, если killed из Suspended)

Управление через SceneDelegate (с поддержкой многозадачности, iOS 13+):

Аналогичные методы существуют в SceneDelegate для управления жизненным циклом отдельной сцены (окна) приложения: sceneWillResignActive, sceneDidEnterBackground и т.д.

Практическое значение: В этих методах вы должны освобождать ресурсы (камеру, аудио), приостанавливать анимацию, сохранять данные пользователя и скрывать конфиденциальную информацию (например, при переходе в background).

Ответ 18+ 🔞

Давай разберём этот ваш жизненный цикл приложения, а то как будто про какую-то мартышку речь, а не про код. Сидит эта мартышка, значит, в своём айфоне и думает: «А че оно там делает, когда я его сворачиваю?»

Смотри, есть у приложения, как у любого нормального организма, свои состояния. Оно не может просто взять и впендюриться в память навечно. Система за ним следит, как за ребёнком в песочнице.

Вот основные этапы этой драмы:

  1. Not Running (Не запущено). Всё просто — приложение лежит, как бревно, и нихуя не делает. Как твои планы на понедельник.
  2. Inactive (Неактивное). Приложение уже вылезло на передний план, но его как будто заморозили. Например, когда тебе звонок пришёл или системный алерт вылез. Состояние краткое, мимолётное, как твоё желание заняться спортом.
  3. Active (Активное). А вот это — царство! Приложение на переднем плане, получает все события, тыкается, работает. Нормальный рабочий режим.
  4. Background (Фоновое). Ты приложение свернул, но оно ещё может что-то тихонько делать. Докачать файл, геолокацию обновить. Но система даёт ему мало времени, потом скажет: «Всё, хули ты тут вертишься, засыпай».
  5. Suspended (Приостановленное). Вот тут уже полный анабиоз. Код не выполняется, но процесс и память висят. Система может в любой момент, если ей память понадобится, подойти и въебать приложению по голове, завершив его без лишних слов. Жестоко, но реалистично.

Раньше, в старые добрые времена (до iOS 13), всем этим цирком в одиночку рулил AppDelegate. Мужик был один, за всё отвечал.

// Приложение запустилось, можно начинать шабаш
func application(_:didFinishLaunchingWithOptions:) -> Bool

// Нас сейчас отвлекли (звонок, алерт). Приложение Active -> Inactive
func applicationWillResignActive(_:)

// О, отвлекли и вернули! Снова в деле. Inactive -> Active
func applicationDidBecomeActive(_:)

// Совсем убрали с глаз долой. Свернули. Inactive -> Background
func applicationDidEnterBackground(_:)

// А мы, сука, вернулись! Снова вылезаем на передний план. Background -> Inactive
func applicationWillEnterForeground(_:)

// Ну всё, пиздец, завершают нас. Прощай, cruel world.
func applicationWillTerminate(_:)

Важный момент: последний метод (applicationWillTerminate) может и не вызваться, если систему просто задолбало твоё приложение в состоянии Suspended, и она его прибила без предупреждения. Доверия ебать ноль.

С iOS 13 и многозадачностью появился ещё и SceneDelegate. Теперь у каждого окна приложения (сцены) свой собственный жизненный цикл. Методы там похожие: sceneWillResignActive, sceneDidEnterBackground и так далее.

А нахуя это всё нужно? А затем, чувак, чтобы не быть мудаком. В этих методах ты должен:

  • Отпускать дорогие ресурсы (камеру, микрофон, аудиосессию), а то батарею сожрёшь.
  • Приостанавливать анимации и видео.
  • Быстро-быстро сохранять все данные пользователя, а то он потом придёт и спросит, блядь, где его несохранённый шедевр.
  • Когда приложение уходит в фон — прятать конфиденциальную инфу (пароли, пин-коды) с экрана. А то откроешь ты телефон в метро, а там твоя банковская карта на весь вагон светится.