Мобильная разработка
Push Notifications
WhatsApp показывает количество непрочитанных сообщений даже когда приложение закрыто. Telegram мгновенно пробуждается при входящем звонке. Uber обновляет местоположение водителя в реальном времени. За всем этим стоит одна инфраструктура - push notification pipeline.
- **Финансовые приложения** - мгновенные уведомления о транзакциях через silent push + badge update без лишних запросов к API
- **Мессенджеры** - Telegram использует VOIP push (отдельный приоритетный канал) для входящих звонков, чтобы iOS не убил приложение
- **E-commerce** - персонализированные rich notifications с изображением товара прямо в шторке повышают конверсию на 20-30%
Apple Push Notification Service (APNS)
Push-уведомление не приходит с сервера напрямую на телефон. Между ними стоит посредник - APNS у Apple. Это постоянное TLS-соединение, которое iOS держит к серверам Apple. Никаких polling, никаких открытых портов на стороне устройства.
Авторизация к APNS идёт через provider certificate (p12) или token-based auth (p8 + JWT). Токен выгоднее: один ключ работает для всех приложений аккаунта, не требует ежегодного обновления, не привязан к конкретному серверу.
Ключевой параметр запроса - `apns-priority`. Значение `10` = немедленная доставка (требует alert/sound/badge). Значение `5` = отложенная доставка, щадящая батарею. Silent push (`content-available: 1`) работает только с приоритетом 5.
Что такое device token в контексте APNS?
Firebase Cloud Messaging (FCM)
FCM - это уровень абстракции над APNS (для iOS) и прямой транспорт для Android. Google уже держит постоянные соединения к каждому Android-устройству через Google Play Services. FCM просто маршрутизирует сообщение в нужный канал.
На практике FCM решает одну конкретную проблему: кроссплатформенный backend. Один HTTP-вызов - и уведомление уходит на iOS, Android и Web одновременно. APNS при этом задействуется автоматически через internal bridge.
FCM Registration Token обновляется при каждой переустановке и иногда самостоятельно. Backend должен обрабатывать callback `onTokenRefresh` (Android) или аналог iOS, и обновлять токен в БД. Стейл токены дают `NotRegistered` ошибку - их нужно удалять.
Как FCM доставляет уведомления на iOS?
Silent Push: фоновая синхронизация
Silent push - уведомление без визуального оповещения. Устройство получает сигнал, пробуждает приложение на ~30 секунд и даёт время выполнить фоновую работу: скачать данные, обновить кэш, синхронизировать состояние.
Это единственный надёжный способ разбудить iOS-приложение по инициативе сервера. Background fetch и BGTaskScheduler работают по расписанию системы, silent push - мгновенно. Mail.app использует именно этот механизм для показа badge с новым числом писем.
iOS ограничивает silent push: слишком частые или не завершённые вовремя вызовы снижают приоритет доставки. Apple не гарантирует доставку, когда Low Power Mode включён или устройство не использовалось давно. Для критичных данных нужна комбинация - видимое уведомление + запуск фоновой синхронизации.
Зачем устанавливать `content-available: 1` в payload?
Rich Notifications и Notification Extensions
Rich notifications - уведомления с медиа: изображения, видео, кастомный UI. На iOS это реализуется через два extension target: Notification Service Extension (модифицирует payload до показа) и Notification Content Extension (кастомный интерфейс самого уведомления).
На Android аналог - Notification Channels (обязательны с API 26) и расширенные шаблоны: BigTextStyle, BigPictureStyle, InboxStyle. Telegram использует bigPicture для предварительного просмотра фото прямо в шторке.
Notification Service Extension запускается только при `mutable-content: 1` в payload и только для уведомлений с alert. Лимит выполнения - 30 секунд. Если не вызвать contentHandler вовремя, iOS покажет оригинальный payload без модификаций.
Push-уведомления доставляются напрямую от сервера к телефону
Между сервером и устройством всегда стоит посредник - APNS (Apple) или FCM (Google)
Операционная система контролирует все соединения из соображений безопасности и оптимизации батареи. Прямой TCP-сокет от любого сервера невозможен без участия platform gateway
Notification Service Extension позволяет...
Связанные темы
Push notifications пересекаются с сетевой безопасностью, офлайн-архитектурой и тестированием:
- Offline-first архитектура — Silent push запускает синхронизацию офлайн-кэша
- Mobile Security — Безопасное хранение device tokens в Keychain
- WebSocket и Real-time — Альтернатива push для foreground-состояния
Ключевые идеи
- **APNS и FCM** - единственные легальные каналы push на iOS/Android: прямых соединений от сервера к устройству нет
- **Silent push** (`content-available: 1`) - способ разбудить приложение для фоновой работы без показа уведомления пользователю
- **Notification Service Extension** перехватывает payload до отображения: позволяет дозагрузить медиа и изменить текст
- **Device token** не постоянен - меняется при переустановке, backend должен обновлять и очищать стейл-токены
Вопросы для размышления
- Почему Apple сделала APNS обязательным посредником, а не разрешила прямые соединения от любого сервера?
- Как балансировать между немедленными уведомлениями и сохранением батареи пользователя?
- Что произойдёт с неактивными device tokens через 6 месяцев и как backend должен на это реагировать?
Связанные уроки
- mob-14 — Offline-first архитектура определяет стратегию sync при доставке
- mob-16 — Безопасное хранение push-токенов через Keychain/Keystore
- sec-11 — TLS/PKI лежит под APNS и FCM на уровне транспорта
- web-15 — Web Push через Service Worker - тот же паттерн доставки
- mob-17 — Тестирование push-сценариев требует понимания silent push
- sd-29-notifications