Firebase Cloud Messaging (FCM) — это кроссплатформенный сервис доставки push-уведомлений и сообщений от Google, предназначенный для мобильных и веб-приложений. FCM обеспечивает надёжную передачу данных между сервером и клиентскими устройствами без необходимости поддерживать постоянное сетевое соединение. По данным Firebase Documentation, 2026, через инфраструктуру FCM ежедневно проходит более 300 миллиардов сообщений по всему миру. Сервис поддерживает как уведомления с автоматическим отображением, так и data-сообщения для скрытой передачи данных в фоне.
Главное
Firebase Cloud Messaging — это облачный сервис Google, который обеспечивает передачу push-уведомлений и data-сообщений между сервером приложения и клиентскими устройствами. Сервис заменил устаревший Google Cloud Messaging (GCM) и стал стандартным решением для доставки push в экосистеме Firebase. FCM поддерживает Android, iOS, Web и Unity, обеспечивая единый интерфейс отправки независимо от целевой платформы.
Сервис предоставляет несколько механизмов доставки сообщений, каждый из которых решает свою задачу. Notification-сообщения отображаются системой автоматически при получении — разработчику не нужно писать код для показа уведомления. Data-сообщения передают произвольный payload в виде пар ключ-значение и обрабатываются внутри приложения. Комбинированные сообщения содержат одновременно видимую и скрытую части для максимальной гибкости.
Реализация собственного push-сервера требует постоянного поддержания TCP-соединения с каждым устройством, что неэффективно и небезопасно. FCM использует единую инфраструктуру Google, которая поддерживает соединение с миллиардами устройств одновременно. Сервис автоматически управляет повторными попытками доставки, очередями сообщений и балансировкой нагрузки, освобождая разработчика от необходимости решать эти задачи самостоятельно.
Архитектура FCM состоит из трёх ключевых компонентов: сервер провайдера (ваш backend), сервер Firebase Cloud Messaging и клиентское приложение на устройстве. Когда сервер отправляет сообщение, оно сначала попадает в инфраструктуру FCM, которая маршрутизирует его на целевое устройство. Если устройство офлайн, FCM хранит сообщение в очереди и доставляет его при восстановлении соединения.
При первом запуске приложение вызывает Firebase SDK, который регистрирует устройство в сервисе FCM и получает уникальный Registration Token. Этот токен представляет собой строку длиной около 150 символов и идентифицирует конкретный экземпляр приложения на конкретном устройстве. Токен может меняться при переустановке приложения, очистке данных или восстановлении из бэкапа — разработчик должен обрабатывать обновление токена через делегат onNewToken.
Когда сервер отправляет запрос через FCM API, сообщение проходит через несколько этапов. Приём и валидация — FCM проверяет корректность запроса и наличие целевого устройства. Очередь — если устройство недоступно, сообщение попадает в очередь хранения. Маршрутизация — FCM определяет оптимальный канал доставки (Wifi или сотовые данные). Доставка — система передаёт сообщение целевому приложению. После успешной доставки FCM возвращает серверу идентификатор сообщения.
Firebase Cloud Messaging поддерживает три типа сообщений, каждый из которых имеет свои особенности обработки на клиентской стороне. Notification-сообщения обрабатываются системным сервисом Google Play Services в Android и APNs в iOS и автоматически отображаются в виде push-баннеров. Data-сообщения передаются непосредственно в приложение и обрабатываются через callback onMessageReceived в Android и application(_:didReceiveRemoteNotification:) в iOS.
Notification-сообщение содержит предопределённые поля: title, body, image URL и звук уведомления. Система автоматически создаёт и отображает уведомление в системном tray, даже если приложение находится в фоне или убито. Пользователь видит стандартный баннер с заголовком и текстом, а при нажатии приложение открывается с переданными в payload данными. Если приложение активно, notification-сообщение можно перехватить и обработать в коде.
Data-сообщение — это кастомный набор пар ключ-значение без предопределённых полей. Payload не обрабатывается системой автоматически — приложение получает сырые данные и может интерпретировать их произвольным образом. Data-сообщения используются для синхронизации данных в фоне, обновления локального кэша, триггера синхронизации или передачи команд без отображения уведомления. В Android data-сообщение доставляется всегда, даже если приложение убито или в фоне.
FCM позволяет отправлять сообщение, которое содержит одновременно notification-часть (для отображения) и data-часть (для обработки). Комбинированный payload включает как предопределённые поля notification, так и произвольные ключи data. Система отображает уведомление из notification-части, а data-часть передаётся в intent extras приложения при открытии. Это удобно для сценариев, где нужно показать пользователю уведомление и одновременно передать контекст для перехода на конкретный экран.
| Тип | Авто-отображение | Обработка в фоне | Пример |
|---|---|---|---|
| Notification | Да, системой | Автоматически, без кода | Приветственное push-уведомление |
| Data | Нет | Через callback приложения | Синхронизация данных в фоне |
| Комбинированное | Да, notification-часть | Data-часть при открытии | Уведомление + ссылка на заказ |
Интеграция FCM в Android начинается с подключения Firebase SDK через файл build.gradle на уровне приложения. После добавления зависимостей и файла google-services.json приложение автоматически получает Registration Token, который передаётся через callback FirebaseMessagingService. Для приёма уведомлений необходимо создать сервис, наследующий FirebaseMessagingService, и зарегистрировать его в AndroidManifest.xml.
После подключения SDK Firebase автоматически генерирует токен устройства без дополнительного кода. Токен доступен через FirebaseMessaging.getInstance().token, который возвращает Task
class MyFirebaseMessagingService :
FirebaseMessagingService() {
override fun onNewToken(token: String) {
sendTokenToServer(token)
}
override fun onMessageReceived(
message: RemoteMessage
) {
val data = message.data
val title = "Новое сообщение"
val body = data["body"] ?: ""
showNotification(title, body)
}
}
Сервис для приёма FCM-сообщений необходимо зарегистрировать в AndroidManifest.xml с соответствующими intent-filter. Добавление тега service с разрешением INTERNET и указанием action. Без регистрации сервиса сообщения не будут доставляться приложению в фоновом режиме. Для отображения уведомлений в Android 13+ требуется runtime-пермишен POST_NOTIFICATIONS.
<!-- AndroidManifest.xml -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name=
"android.permission.POST_NOTIFICATIONS" />
<service
android:name=".MyFirebaseMessagingService"
android:exported="false">
<intent-filter>
<action android:name=
"com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
Интеграция FCM в iOS требует настройки как на стороне Apple Push Notification Service (APNs), так и в Firebase Console. В отличие от Android, где FCM управляет соединением напрямую, в iOS FCM использует APNs как транспортный слой. Приложение регистрируется на получение push-уведомлений через UIApplication.shared.registerForRemoteNotifications, а Firebase SDK перехватывает полученный device token и связывает его с FCM Registration Token.
Для работы FCM в iOS необходимо загрузить APNs-ключ или сертификат в Firebase Console. APNs-ключ — это современный способ аутентификации без сертификатов (рекомендуется Apple). Ключ создаётся в Apple Developer Portal в разделе Keys и загружается в настройки Cloud Messaging в Firebase Console. После настройки APNs приложение запрашивает разрешение на уведомления через UNUserNotificationCenter и регистрируется через APNs.
import Firebase
import UserNotifications
class AppDelegate: NSObject, UIApplicationDelegate {
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions
launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
FirebaseApp.configure()
UNUserNotificationCenter.current()
.requestAuthorization(options: [.alert, .sound, .badge])
application.registerForRemoteNotifications()
return true
}
func application(
_ application: UIApplication,
didRegisterForRemoteNotificationsWithDeviceToken
deviceToken: Data
) {
Messaging.messaging()
.apnsToken = deviceToken
}
}
Для обработки полученных уведомлений реализуется делегат UNUserNotificationCenter. Метод willPresent вызывается, когда уведомление получено при активном приложении — здесь можно показать кастомную in-app нотификацию или проигнорировать системный баннер. Метод didReceive вызывается, когда пользователь нажимает на уведомление — здесь выполняется переход на соответствующий экран. Для data-сообщений используется делегат MessagingDelegate, который получает payload при получении FCM-сообщения в фоне.
Серверная отправка FCM-сообщений выполняется через HTTP v1 API Firebase Cloud Messaging или устаревший Firebase Cloud Messaging API. HTTP v1 API является рекомендуемым способом, использует OAuth 2.0 аутентификацию через Service Account и поддерживает все современные возможности FCM, включая аналитику доставки и A/B-тестирование уведомлений. Запрос отправляется POST-методом на endpoint https://fcm.googleapis.com/v1/projects/{project_id}/messages:send.
Тело запроса содержит JSON-объект с информацией о сообщении: target (токен, топик или условие), notification (для отображения) и data (кастомный payload). Аутентификация через Service Account JSON-ключа, который загружается в переменные окружения сервера. Токен доступа генерируется через библиотеку google-auth-library. Google рекомендует использовать Firebase Admin SDK для автоматического управления аутентификацией и повторными попытками.
const admin = require("firebase-admin")
const serviceAccount = require("./serviceAccountKey.json")
admin.initializeApp({ credential: admin.credential.cert(serviceAccount) })
const message = {
token: "device_registration_token",
notification: { title: "Скидка 20%", body: "На все услуги сегодня" },
data: { screen: "promo", promoId: "324" },
android: { priority: "high" },
apns: { payload: { aps: { sound: "default" } } }
}
admin.messaging().send(message)
.then(response => {
console.log("Успешно отправлено:", response)
})
.catch(error => {
console.log("Ошибка отправки:", error)
})
Для отправки уведомлений группе пользователей FCM поддерживает подписку на топики. Топик (topic) — это именованный канал, на который клиентское приложение подписывается через FirebaseMessaging.getInstance().subscribeToTopic(). Сервер может отправить сообщение на топик, и оно будет доставлено всем подписанным устройствам. Топики подходят для новостных рассылок, уведомлений об акциях и событийных push. Для более точной сегментации используются условия (conditions) на основе нескольких топиков с логическими операторами.
Часто задаваемые вопросы
FCM работает на Android через собственную инфраструктуру Google, а на iOS использует APNs как транспортный протокол. FCM предоставляет единый API для обеих платформ, автоматическое хранение сообщений в офлайне и аналитику доставки, чего нет в чистом APNs.
Да, через Firebase Console в разделе Cloud Messaging можно отправлять уведомления вручную на выбранные устройства, топики или сегменты аудитории. Функция подходит для тестирования и разовых рассылок, но не заменяет серверную интеграцию для production-приложений.
Подпишитесь на обновления токена через onNewToken в FirebaseMessagingService (Android) или MessagingDelegate (iOS). При изменении токена отправьте новый токен на сервер и удалите старый. Сервер должен обновить базу данных и прекратить попытки отправки на устаревший токен.
FCM хранит сообщение в очереди до 28 дней и доставляет его при восстановлении соединения. Для notification-сообщений коллапсируется только последнее сообщение для каждой коллапс-группы. Data-сообщения хранятся отдельно и доставляются в порядке отправки без коллапса.
FCM полностью бесплатен без ограничений на количество сообщений. Использование FCM не тарифицируется ни в рамках плана Spark, ни в плане Blaze. Ограничения есть только на размер payload: до 4 KB для notification-сообщений и до 2 KB для data-сообщений.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также