Push-уведомления — это сообщения, отправляемые сервером на мобильное устройство даже при закрытом приложении. По данным Google Firebase, 2024, Push-уведомления обрабатываются через специализированные сервисы — FCM на Android и APNS на iOS, которые поддерживают доставку в реальном времени миллионам устройств одновременно. Они стали неотъемлемой частью пользовательского опыта в современных мобильных приложениях.
Главное
Push-уведомления — это короткие сообщения, которые сервер приложения отправляет на устройство пользователя без его явного запроса. Они отображаются в виде баннеров, значков на иконке или звуковых сигналов, привлекая внимание пользователя к приложению и информируя о важных событиях.
Push-уведомление состоит из заголовка, тела сообщения и необязательных данных (payload). В отличие от SMS, Push-уведомления бесплатны для пользователя и доставляются через инфраструктуру облачных сервисов — FCM для Android и APNS для iOS. Основные цели Push-уведомлений: повышение вовлечённости, информирование о событиях и возврат пользователя в приложение.
Статистика использования показывает, что правильно настроенные Push-уведомления увеличивают retention приложения на 30-60%. Однако избыточная частота уведомлений приводит к отпискам — более 60% пользователей отключают уведомления, если их отправляют чаще трёх раз в день.
Push-система включает три компонента: сервер приложения (app server), платформенный сервис (FCM/APNS) и клиентское приложение на устройстве. Сервер отправляет запрос платформенному сервису, который доставляет уведомление на целевое устройство через постоянное соединение с ОС.
Механизм доставки Push-уведомлений основан на постоянном соединении между устройством и платформенным сервисом. Операционная система поддерживает зашифрованный канал связи, через который проходят все Push-сообщения.
При первом запуске приложение запрашивает разрешение на отправку уведомлений и получает уникальный токен устройства от FCM или APNS. Этот токен — строка длиной до 4 КБ, однозначно идентифицирующая экземпляр приложения. Токен меняется при переустановке приложения или восстановлении устройства из резервной копии.
class FirebaseMessagingService :
FirebaseMessagingService() {
override fun onNewToken(token: String) {
sendTokenToServer(token)
}
override fun onMessageReceived(
message: RemoteMessage
) {
showNotification(message.notification)
}
}
Сервер приложения отправляет HTTP-запрос к FCM API или APNS API, указывая целевой токен, заголовок, тело и дополнительные данные. Платформенный сервис отвечает статусом доставки: success, invalid token (устройство удалило приложение) или rate-limited (превышена частота отправки).
fetch("https://fcm.googleapis.com/fcm/send", {
method: "POST",
headers: {
"Authorization": "key=AIzaSy...",
"Content-Type": "application/json"
},
body: JSON.stringify({
to: "device_token_here",
notification: {
title: "Новое сообщение",
body: "У вас новое уведомление!"
}
})
})
Выбор между FCM и APNS зависит от целевой платформы. FCM поддерживает Android и iOS, APNS — только экосистему Apple. Рассмотрим ключевые различия, важные для разработки кросс-платформенных мобильных приложений.
FCM — сервис Google, работающий поверх Google Play Services. Он поддерживает две схемы доставки: уведомления с автоматическим отображением (display notifications) и data-уведомления, которые приложение обрабатывает самостоятельно. FCM бесплатен и не имеет ограничений на количество отправляемых сообщений.
APNS — сервис Apple с поддержкой мультимедийных вложений (изображения, видео, аудио) размером до 10 МБ. Для отправки через APNS требуется TLS-сертификат или ключ аутентификации. APNS ограничивает частоту отправки на одно устройство — не более 150 уведомлений в минуту, после чего включает rate limiting.
| Характеристика | FCM | APNS |
|---|---|---|
| Платформы | Android, iOS, Web | iOS, macOS, watchOS |
| Требования | Google Play Services | Apple Developer Program |
| Медиа | до 4 КБ (data) | до 10 МБ (attachments) |
| Приоритет | normal/high | immediate/power-saving |
| Стоимость | бесплатно | бесплатно (требуется аккаунт) |
Push-уведомления классифицируются по способу отображения и назначению. Понимание типов помогает выбрать правильную стратегию для каждого сценария взаимодействия с пользователем.
Самый распространённый тип — отображаемое уведомление с заголовком и телом. ОС автоматически показывает его в системной шторке, на экране блокировки и в виде баннера. Разработчик может настроить звук, вибрацию, значок на иконке и action-кнопки для прямых действий (ответить, открыть, отклонить).
Data-уведомления содержат только payload без визуального отображения. Приложение обрабатывает их в фоне: синхронизирует данные, обновляет кэш или запускает загрузку. На Android data-уведомления доставляются гарантированно, на iOS — только при активном приложении или через background fetch.
Современные мобильные ОС поддерживают расширенные и media-уведомления с изображениями, GIF, видео и аудио. На iOS это реализовано через UNNotificationAttachment, на Android — через BigPictureStyle и InboxStyle для кастомизации вида уведомления в системной шторке.
Silent-уведомления не отображаются пользователю и используются для фоновой синхронизации. На iOS они имеют высокий приоритет для задач типа обновления данных перед открытием приложения. Android трактует их как data-уведомления с минимальным приоритетом.
Настройка Push-уведомлений требует действий на уровне инфраструктуры, серверной части и клиентского кода. Рассмотрим типовой процесс для кросс-платформенного мобильного проекта.
Для Android необходимо создать проект в Firebase Console, добавить google-services.json в проект и настроить FirebaseMessagingService. Токен устройства получается через FirebaseInstanceId или FirebaseMessaging.getInstance().token, после чего отправляется на сервер через API при первом запуске или при его изменении.
Для iOS требуется подписка на Apple Developer Program, создание Push-сертификата или APNS-ключа в Developer Portal, и включение Capability Push Notifications в Xcode. Регистрация на уведомления выполняется через UIApplication.shared.registerForRemoteNotifications с получением deviceToken в AppDelegate.
import UIKit
import UserNotifications
@main
class AppDelegate: UIResponder,
UIApplicationDelegate {
func application(
_ application: UIApplication,
didRegisterForRemoteNotificationsWithDeviceToken
deviceToken: Data
) {
let token = deviceToken
.map { String.format("%02x", $0) }
.joined()
// отправить token на свой сервер
}
}
На серверной стороне Push-уведомления отправляются через REST API или Admin SDK. Для FCM используется Firebase Admin SDK (доступен для Node.js, Java, Python, Go), для APNS — pusher-библиотеки (pushy для Java, apn2 для Node.js). Рекомендуется хранить токены в базе данных с меткой времени последнего обновления.
Безопасность Push-уведомлений критически важна, так как через них могут передаваться конфиденциальные данные. Обе платформы предоставляют базовые механизмы защиты, но разработчик обязан правильно их использовать.
Payload Push-уведомления может содержать персональные данные пользователей: имена, суммы транзакций, ссылки на сообщения. Даже если канал связи между FCM/APNS и устройством зашифрован, данные могут быть перехвачены на уровне приложения при перехвате уведомления сторонним ПО. Рекомендуется шифровать чувствительный payload на сервере алгоритмом AES-256 и дешифровать его на устройстве с помощью ключа, хранящегося в Keychain (iOS) или EncryptedSharedPreferences (Android).
Токен устройства — это идентификатор сессии, который может быть скомпрометирован при взломе устройства или перехвате трафика. Сервер приложения должен проверять токены перед отправкой: сверять их с БД, отслеживать неактивные токены и удалять их при повторяющихся ошибках InvalidToken. FCM и APNS возвращают статус InvalidRegistration для неверных токенов — не игнорируйте его.
Без контроля частоты Push-уведомления могут стать инструментом спама, который раздражает пользователей и снижает retention. Установите на сервере лимиты: не более 5 уведомлений в час одному пользователю и не более 3 одинаковых сообщений. Для транзакционных уведомлений (подтверждение заказа, смена пароля) лимиты могут быть выше — до 10 в час, так как они несут критически важную информацию. Используйте rate limiting на уровне API отправки, чтобы злоумышленник не смог вызвать массовую рассылку через ваш сервер.
Часто задаваемые вопросы
Да, через прямое подключение к APNS не поддерживается на Android — для устройств без Google Play Services используются альтернативы вроде Huawei Mobile Services (HMS) и собственные WebSocket-соединения. Однако FCM остаётся стандартом для большинства приложений благодаря бесплатности и надёжности.
FCM и APNS сохраняют последнее уведомление на своих серверах и доставляют его при восстановлении соединения. На каждом устройстве хранится только последнее уведомление от каждого приложения, поэтому при длительном отсутствии сети теряются промежуточные сообщения.
Наиболее частые причины — истекший Push-сертификат APNS (действителен 1 год), неверный токен устройства, отключённые уведомления в настройках или включённый режим энергосбережения. Проверьте сертификат в Apple Developer Console и убедитесь, что приложение запрашивает разрешение через UNUserNotificationCenter.
На Android используйте PendingIntent в NotificationCompat.Builder с отслеживанием открытия через Intent. На iOS — метод UNUserNotificationCenterDelegate.userNotificationCenter(_:didReceive:withCompletionHandler:). FCM предоставляет отчёты по доставке и открытиям для каждого отправленного уведомления.
Незначительно — Push-уведомления не держат постоянное соединение; ОС использует единый системный канал для всех приложений, что минимизирует общее энергопотребление. Частая отправка (каждые 5 минут) потребляет больше энергии на пробуждение устройства и выход из спящего режима. Silent-уведомления на iOS расходуют больше заряда из-за активации приложения в фоне для обработки полученных данных.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также