Как обрабатывается push-уведомление в iOS, когда приложение не запущено?

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

Ответ

Когда приложение находится в состоянии not running (закрыто или не запускалось после перезагрузки устройства), обработка push-уведомления зависит от действий пользователя.

Сценарий 1: Пользователь тапает по уведомлению

  1. Приложение запускается, проходя состояния: not runninginactiveactive.
  2. В AppDelegate вызывается метод application(_:didFinishLaunchingWithOptions:). Полезная нагрузка (payload) уведомления доступна в словаре launchOptions по ключу UIApplication.LaunchOptionsKey.remoteNotification.
  3. После этого вызывается метод application(_:didReceiveRemoteNotification:fetchCompletionHandler:).

Пример обработки:

func application(_ application: UIApplication,
                 didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

    if let notificationPayload = launchOptions?[.remoteNotification] as? [String: Any] {
        // Обработка данных уведомления при запуске
        handleNotificationAtLaunch(payload: notificationPayload)
    }
    return true
}

Сценарий 2: Пользователь игнорирует уведомление

  • Приложение остается в состоянии not running.
  • Ни один из методов AppDelegate для обработки удаленных уведомлений не вызывается.

Важно: Для поддержки фонового обновления контента через push (Background Fetch) необходимо:

  1. Включить capability Background Modes и отметить Remote notifications.
  2. В payload уведомления добавить ключ "content-available": 1.
  3. Реализовать fetchCompletionHandler для уведомления системы о завершении работы.