Мобильная разработка

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
Push Notifications

0

1

Войти