Как работают push-уведомления на iOS и Android
Основы3 минРедакция Innovialabs
Коротко
Ваш сервер не отправляет push напрямую на телефон: он передает сообщение с токеном устройства в сервис платформы — APNs у Apple или Firebase Cloud Messaging у Google, — а тот доставляет его на устройство. Показать уведомление можно только с разрешения пользователя.
Коротко о главном
Push-уведомление проходит через посредника. Приложение не держит постоянное соединение с вашим сервером — это разряжало бы батарею. Вместо этого операционная система поддерживает одно общее соединение с сервисом платформы:
- APNs (Apple Push Notification service) — для iOS, iPadOS, macOS и watchOS;
- FCM (Firebase Cloud Messaging) — для Android, а также как единая точка входа, которая умеет отправлять и на iOS через APNs.
Ваш сервер отправляет сообщение в APNs или FCM, а они доставляют его на нужное устройство.
Путь уведомления от сервера до экрана
- Приложение регистрируется в системе push при запуске.
- Платформа выдает токен — уникальный адрес конкретной установки приложения на конкретном устройстве.
- Приложение отправляет токен на ваш бэкенд, где он сохраняется вместе с ID пользователя.
- Сервер формирует сообщение и отправляет его в APNs или FCM, указывая токен.
- Сервис доставляет сообщение на устройство, когда оно в сети.
- ОС показывает уведомление или будит приложение для обработки данных.
Токены устройств
Токен — не постоянный идентификатор. Он может измениться после переустановки приложения, восстановления устройства из бэкапа или по решению платформы. Поэтому:
- обновляйте токен на сервере при каждом запуске, если он изменился;
- удаляйте токены, на которые APNs или FCM возвращают ошибку «недействителен»;
- храните несколько токенов на пользователя — у человека может быть телефон и планшет.
Как сервер отправляет push
Для APNs сервер аутентифицируется ключом .p8 из аккаунта Apple Developer (или сертификатом) и отправляет запрос по HTTP/2. Минимальный payload выглядит так:
{
"aps": {
"alert": { "title": "Заказ в пути", "body": "Курьер приедет через 15 минут" },
"sound": "default"
},
"order_id": "4821"
}
Для FCM используется HTTP v1 API с OAuth-токеном сервисного аккаунта:
{
"message": {
"token": "DEVICE_TOKEN",
"notification": { "title": "Заказ в пути", "body": "Курьер приедет через 15 минут" },
"data": { "order_id": "4821" }
}
}
Подробности — в официальной документации Firebase Cloud Messaging.
Видимые и тихие уведомления
| Тип | Что делает | Нужно разрешение | Гарантия доставки |
|---|---|---|---|
| Видимое | Показывает баннер, звук, бейдж | Да | Высокая |
| Тихое (silent) | Будит приложение в фоне без показа | Нет | Не гарантируется |
Тихие уведомления на iOS отправляются с content-available: 1 и используются для фоновой синхронизации. Система ограничивает их частоту и может отложить или пропустить, если батарея на исходе или приложение принудительно закрыто. На Android аналог — data-сообщения без блока notification; их обрабатывает код приложения.
Не стройте критичную логику только на тихих пушах: это подсказка «стоит обновиться», а не надежный канал.
Правила разрешений
- iOS: показ уведомлений всегда требует явного разрешения пользователя через системный диалог. Есть provisional-режим: уведомления приходят тихо в Центр уведомлений без запроса, и пользователь сам решает, оставить ли их.
- Android: в современных версиях системы приложение тоже должно запросить разрешение
POST_NOTIFICATIONS. Кроме того, уведомления группируются по каналам, и пользователь может отключить каждый канал отдельно.
Системный диалог на iOS показывается один раз. Если пользователь отказал, вернуть разрешение можно только через настройки.
Как не потерять разрешение
- Не запрашивайте доступ при первом запуске без контекста.
- Сначала объясните пользу на своем экране: «Сообщим, когда курьер будет рядом».
- Запрашивайте в момент, когда польза очевидна, например после оформления заказа.
- Дайте настройки внутри приложения: какие темы присылать, а какие нет.