← Назад к вопросам

Какие знаешь push, которые могут разбудить приложение?

2.3 Middle🔥 121 комментариев
#Работа с сетью

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Push-уведомления, способные "разбудить" приложение

В iOS существуют типы push-уведомлений, которые могут активировать ("разбудить") приложение, даже когда оно закрыто, находится в фоновом режиме или устройство заблокировано. Это критически важно для обработки срочных обновлений, фоновых задач и обеспечения функциональности в реальном времени. Ключевым механизмом является Background Execution и специальные флаги в полезной нагрузке (payload) уведомления.

1. Push-уведомления с content-available флагом (Silent Push)

Наиболее распространённый способ — это silent push-уведомления (фоновые), которые не отображаются пользователю и предназначены исключительно для активации приложения в фоне. Они активируют метод application(_:didReceiveRemoteNotification:fetchCompletionHandler:) в AppDelegate.

Полезная нагрузка должна содержать:

{
  "aps": {
    "content-available": 1,
    "sound": ""
  },
  "custom_data": "value"
}
  • content-available: 1 — ключевой флаг, сообщающий системе, что приложение должно получить возможность выполнить фоновую работу.
  • sound: "" (пустая строка) — рекомендуется, чтобы уведомление было действительно беззвучным и не тревожило пользователя.
  • Внимание: Время на выполнение фоновой задачи ограничено (~30 секунд). По завершении обязательно нужно вызвать fetchCompletionHandler(.newData) (или другую вариацию).

Пример обработки в AppDelegate (Swift):

func application(_ application: UIApplication,
                 didReceiveRemoteNotification userInfo: [AnyHashable: Any],
                 fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {

    // 1. Проверяем наличие флага
    guard let aps = userInfo["aps"] as? [String: Any],
          aps["content-available"] as? Int == 1 else {
        // Это обычное push-уведомление
        completionHandler(.noData)
        return
    }

    // 2. Выполняем фоновую задачу (синхронизация, загрузка данных и т.д.)
    DispatchQueue.global().async {
        // ... Ваша логика (например, загрузка новых сообщений) ...

        // 3. Сигнализируем системе о результате
        let success = true // или false
        completionHandler(success ? .newData : .failed)
    }
}

Важные ограничения:

  • Частота таких уведомлений регулируется системой Push Notification Coalescing. iOS может группировать или отбрасывать silent push, чтобы сохранить заряд батареи.
  • Приложение не может быть принудительно запущено, если пользователь явно выгрузил его из списка многозадачности.
  • Требуется включить фоновый режим Remote notifications в Capabilities проекта.

2. Критические оповещения (Critical Alerts)

Введены в iOS 12. Они игнорируют настройки "Do Not Disturb" и режим блокировки, выводя звук и баннер. Хотя основная цель — показать алерт, они также "будят" приложение для обработки.

Полезная нагрузка:

{
  "aps": {
    "alert": {
      "title": "Критическое оповещение",
      "body": "Требуется ваше немедленное внимание"
    },
    "sound": {
      "critical": 1,
      "name": "default",
      "volume": 1.0
    },
    "interruption-level": "critical"
  }
}

Для их отправки требуется особое разрешение (entitlement) от Apple, запрашиваемое во время ревью приложения. Обычно одобряется только для приложений, связанных с жизнью и здоровьем, безопасностью и другими критически важными сферами.

3. Уведомления с высокой важностью (High Priority / Time-Sensitive)

Начиная с iOS 15, появились уровни прерывания (interruption-level). Уровень time-sensitive позволяет уведомлению появиться на заблокированном экране с высоким приоритетом, даже если включён фокус-режим (Focus).

Полезная нагрузка:

{
  "aps": {
    "alert": "Срочное обновление",
    "interruption-level": "time-sensitive",
    "sound": "default"
  }
}

Такое уведомление также "будит" приложение для обработки.

Итог и рекомендации

  • Для фоновых задач (синхронизация, предзагрузка) используйте silent push (content-available: 1).
  • Для критически важных оповещений, требующих гарантированного внимания (медицина, безопасность), запрашивайте право на отправку critical alerts.
  • Для срочных, но не критичных уведомлений (например, срочное сообщение в чате) используйте уровень time-sensitive.
  • Всегда корректно обрабатывайте completionHandler в silent push и учитывайте ограничения фонового выполнения, чтобы избежать падений и неоптимального расхода батареи.

Настройка и тестирование этих типов уведомлений требуют серверной поддержки (формирования правильного payload) и правильной конфигурации сертификатов/ключей APNs.