Комментарии (1)
🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Как работают Push Notifications в iOS
Push-уведомления в iOS — это механизм удаленного оповещения пользователя, инициируемый сервером вашего приложения через Apple Push Notification Service (APNS). Весь процесс представляет собой четко структурированную цепочку взаимодействий между устройством, APNS и вашим сервером.
Основные компоненты и этапы работы
- Регистрация устройства в 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-сервер вашего приложения и сохранить там в связке с идентификатором пользователя. Без этого шага ваш сервер не сможет адресовать сообщения.
- Отправка уведомления с сервера в 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**).
- Обработка на устройстве
Получив уведомление, 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.