Как работает push-уведомление?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Принцип работы Push-уведомлений
Push-уведомление — это механизм асинхронной доставки коротких сообщений от сервера к клиентскому приложению через сторонний сервис, даже когда приложение не активно. В Android для этого используется Firebase Cloud Messaging (FCM) — наследник Google Cloud Messaging (GCM).
Архитектура и ключевые компоненты
- Отправитель (Your App Server) — ваш backend-сервер, который инициирует отправку уведомления.
- FCM Backend (Google) — инфраструктура Google, обеспечивающая маршрутизацию и доставку сообщений.
- Устройство клиента (Client App) — Android-приложение с интегрированной FCM SDK и сервисным токеном (FCM Registration Token).
- Сервис Google Play (Google Play Services) — системный компонент, обеспечивающий постоянное соединение с FCM.
Последовательность работы (Flow)
Весь процесс можно разделить на несколько этапов:
1. Регистрация устройства в FCM
При первом запуске приложение регистрируется в FCM и получает уникальный токен (Registration Token). Этот токен связывает конкретный экземпляр приложения на конкретном устройстве с FCM-серверами Google.
// Пример получения токена в Android-приложении
class MyFirebaseMessagingService : FirebaseMessagingService() {
override fun onNewToken(token: String) {
// Отправляем новый токен на наш сервер для последующей адресной отправки push
sendRegistrationTokenToServer(token)
}
}
2. Передача токена на ваш сервер
Полученный токен необходимо отправить на ваш backend-сервер и сохранить (часто в связке с идентификатором пользователя в вашей системе). Это позволяет серверу адресно отправлять сообщения конкретным устройствам.
3. Отправка уведомления с сервера
Когда вашему серверу нужно отправить push-уведомление, он формирует HTTP-запрос к FCM API, включая:
- Ключ сервера (Server Key) для аутентификации.
- Целевой токен устройства или название темы.
- Данные уведомления (заголовок, текст и т.д.).
- Опционально: data payload — пользовательские данные в формате key-value.
// Пример тела запроса (JSON) от вашего сервера к FCM
{
"to": "dEvIcE_rEgIsTrAtIoN_tOkEn...",
"notification": {
"title": "Новое сообщение",
"body": "Вам пришло новое сообщение от Алексея",
"icon": "ic_notification"
},
"data": {
"sender_id": "12345",
"message_id": "msg_678",
"type": "new_chat"
},
"priority": "high"
}
4. Маршрутизация и доставка через FCM
Серверы Google получают запрос, аутентифицируют его, находят устройство по токену и отправляют сообщение через постоянное фоновое соединение, поддерживаемое Google Play Services.
5. Получение на устройстве и обработка
Здесь есть два основных сценария:
-
Когда приложение в фоне/закрыто: Система Google Play Services принимает сообщение. Если в запросе есть блок
notification, система (Android OS) автоматически отображает уведомление в статус-баре, используя системный трей. При тапе на уведомление будет запущено приложение (заданноеActivity). -
Когда приложение на переднем плане (foreground): Сообщение попадает непосредственно в метод
onMessageReceivedвашегоFirebaseMessagingService. Это позволяет кастомизировать обработку, например, показать собственное уведомление или синхронизировать данные.
override fun onMessageReceived(remoteMessage: RemoteMessage) {
// Обрабатываем полученное сообщение, когда приложение на переднем плане
remoteMessage.notification?.let { notif ->
// Показать свое уведомление, если приложение активно
showCustomNotification(notif.title, notif.body)
}
// Данные из блока "data" доступны всегда
remoteMessage.data?.let { dataPayload ->
val senderId = dataPayload["sender_id"]
val type = dataPayload["type"]
// Обрабатываем данные...
handleInAppEvent(type, senderId)
}
}
Типы сообщений в FCM
- Уведомление (Notification Messages): Содержат предопределенные ключи (
title,body,icon). Частично обрабатываются системой, когда приложение неактивно. - Сообщения с данными (Data Messages): Содержат только пользовательский блок
data. Всегда доставляются вonMessageReceived, требуя обработки внутри приложения.
Важные особенности и оптимизации
- Токен может меняться (после обновления приложения, восстановления устройства и т.д.). Обработка
onNewTokenобязательна для поддержания работоспособности. - Приоритеты сообщений:
high(немедленная доставка, может разбудить устройство) иnormal. - Темы (Topics): Позволяют отправлять сообщения группам устройств, подписавшихся на определенную тему (например, "news_updates").
- Время жизни (TTL): Можно задать, как долго FCM будет пытаться доставить сообщение, если устройство оффлайн.
Таким образом, push-уведомления в Android работают через доверенный посредник (FCM), который обеспечивает надежную, энергоэффективную доставку, управляя фоновыми соединениями за счет системного компонента Google Play Services, что избавляет каждое приложение от необходимости поддерживать свое постоянное соединение с сервером.