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

Как работает Push Notifications?

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

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

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

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

Как работают Push Notifications в iOS

Push-уведомления в iOS — это механизм удаленного оповещения пользователя, инициируемый сервером вашего приложения через Apple Push Notification Service (APNS). Весь процесс представляет собой четко структурированную цепочку взаимодействий между устройством, APNS и вашим сервером.

Основные компоненты и этапы работы

  1. Регистрация устройства в APNS
    При первом запуске приложение запрашивает у системы разрешение на показ уведомлений и получает уникальный **device token**. Этот токен — ключевой идентификатор, который APNS использует для маршрутизации сообщений на конкретное устройство и приложение.

```swift
import UserNotifications

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

    UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { granted, error in
        if granted {
            // Разрешение получено, регистрируемся для remote notifications
            DispatchQueue.main.async {
                UIApplication.shared.registerForRemoteNotifications()
            }
        }
    }
    return true
}

// Успешная регистрация — токен получен
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    // Конвертируем Data в строку (формат, ожидаемый сервером)
    let tokenString = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
    print("Device Token: \(tokenString)")
    // ОТПРАВИТЬ этот токен на ваш сервер!
}

// Ошибка регистрации
func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
    print("Failed to register for remote notifications: \(error)")
}
```

2. Передача токена на ваш сервер

    Полученный токен необходимо отправить на backend-сервер вашего приложения и сохранить там в связке с идентификатором пользователя. Без этого шага ваш сервер не сможет адресовать сообщения.

  1. Отправка уведомления с сервера в APNS
    Когда на вашем сервере возникает событие, требующее отправки push (новое сообщение, напоминание и т.д.), backend формирует **JSON-полезную нагрузку (payload)** и отправляет HTTP/2 запрос на один из endpoints APNS. Для этого необходимо использовать **SSL-сертификат или ключ аутентификации (JWT)**, которые настраиваются в Apple Developer Account. Пример payload:

```json
{
    "aps": {
        "alert": {
            "title": "Новое сообщение",
            "body": "Привет, проверь это!",
            "sound": "default"
        },
        "badge": 1
    },
    "custom_data_key": "custom_value"
}
```

4. Доставка от APNS на устройство

    APNS проверяет сертификат/ключ, валидирует payload и находит целевое устройство по device token. Если устройство онлайн (имеет интернет-соединение), APNS мгновенно доставляет уведомление. Если устройство offline, APNS хранит уведомление какое-то время и доставит его при следующем подключении (**Quality of Service, QoS**).

  1. Обработка на устройстве
    Получив уведомление, iOS проверяет, активно ли приложение:
    *   **Приложение в фоне или закрыто:** Система отображает alert, баннер, устанавливает badge или воспроизводит звук — в зависимости от payload и настроек пользователя.
    *   **Приложение на переднем плане:** Уведомление по умолчанию не показывается. Для его обработки необходимо реализовать делегат `UNUserNotificationCenterDelegate`.

```swift
class NotificationDelegate: NSObject, UNUserNotificationCenterDelegate {
    // Вызывается, когда уведомление получено и приложение на переднем плане
    func userNotificationCenter(_ center: UNUserNotificationCenter,
                                willPresent notification: UNNotification,
                                withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        // Решаем, как показать уведомление: баннер, звук и т.д.
        completionHandler([.banner, .sound])
    }

    // Вызывается, когда пользователь тапает по уведомлению (или действию из него)
    func userNotificationCenter(_ center: UNUserNotificationCenter,
                                didReceive response: UNNotificationResponse,
                                withCompletionHandler completionHandler: @escaping () -> Void) {
        let userInfo = response.notification.request.content.userInfo
        // Извлекаем custom_data_key и навигируем в нужный раздел приложения
        if let customValue = userInfo["custom_data_key"] as? String {
            handleDeepLink(with: customValue)
        }
        completionHandler()
    }
}
```

Типы полезной нагрузки (Payload)

  • Уведомление (Alert): Содержит title, body, возможен subtitle. Отображается в центре уведомлений.
  • Фоновое (Background/Silent): Отправляется с "content-available": 1. Не показывает UI, но пробуждает приложение на несколько секунд для выполнения фоновой задачи (например, синхронизации данных). Требует фонового режима remote-notification.
  • Локальное (Local): Генерируется непосредственно на устройстве по расписанию или триггеру (гео, время) с помощью UNUserNotificationCenter. Не требует сервера и APNS.

Критически важные аспекты для разработчика

  • Device Token может меняться: При переустановке приложения, восстановлении из бэкапа или обновлении iOS. Ваш сервер должен актуализировать токены.
  • Feedback Service: APNS предоставляет сервис, который сообщает о недействительных токенах (например, когда пользователь удалил приложение). Чтобы не слать уведомления "в пустоту", сервер должен периодически опрашивать этот сервис и чистить свою базу токенов.
  • Размер payload ограничен 4KB (4096 байт) для обычных и VoIP-уведомлений.
  • Пользователь всегда может отключить уведомления в настройках системы. Ваше приложение должно корректно обрабатывать этот сценарий.

Таким образом, работа Push Notifications — это слаженное взаимодействие клиентского кода, надежной инфраструктуры APNS и вашего сервера, где device token выступает в роли адреса, а SSL-сертификат/JWT — пропуском для доступа к системе доставки Apple.

Как работает Push Notifications? | PrepBro