Перейти к содержанию
Innovialabs

Как настроить push-уведомления через Firebase Cloud Messaging

Практика3 мин

Коротко

Подключите Firebase к Android и iOS, загрузите APNs-ключ, сохраняйте FCM-токены устройств на сервере и отправляйте сообщения через Firebase Admin SDK; топики подходят для рассылок по интересам, а тестовая отправка из консоли быстро проверяет доставку.

Коротко: как работает FCM

Firebase Cloud Messaging (FCM) — бесплатный сервис Google для доставки push-уведомлений на Android, iOS и в веб. Схема простая:

  1. Приложение получает у FCM токен устройства.
  2. Приложение отправляет токен на ваш сервер.
  3. Сервер просит FCM доставить сообщение по токену или топику.
  4. На Android FCM доставляет сам, на iOS — через APNs Apple.

Шаг 1. Проект Firebase и Android

  1. Создайте проект в Firebase Console.
  2. Добавьте Android-приложение с тем же package name, что в проекте.
  3. Скачайте google-services.json и положите в модуль app.
  4. Подключите Gradle-плагин Google Services и зависимость firebase-messaging.
  5. Начиная с Android 13 нужно запросить разрешение POST_NOTIFICATIONS во время работы приложения.

Сервис для приёма токенов и сообщений:

class PushService : FirebaseMessagingService() {
    override fun onNewToken(token: String) {
        // отправьте токен на свой сервер
    }

    override fun onMessageReceived(message: RemoteMessage) {
        // обработка сообщений, пока приложение открыто
    }
}

Зарегистрируйте сервис в AndroidManifest.xml с intent-filter com.google.firebase.MESSAGING_EVENT.

Шаг 2. iOS и APNs-ключ

  1. Добавьте iOS-приложение в Firebase с вашим Bundle ID, скачайте GoogleService-Info.plist.
  2. В Apple Developer создайте APNs Authentication Key (файл .p8). Сохраните его — скачать повторно нельзя.
  3. В Firebase: Project settings → Cloud Messaging → Apple app configuration — загрузите ключ, укажите Key ID и Team ID.
  4. В Xcode включите capability Push Notifications и Background Modes → Remote notifications.
  5. В коде запросите разрешение у пользователя и зарегистрируйтесь для удалённых уведомлений; Firebase SDK свяжет APNs-токен с FCM-токеном.

Один .p8-ключ работает для всех приложений команды и в обоих окружениях APNs, в отличие от устаревших сертификатов, которые нужно было продлевать.

Шаг 3. Работа с токенами

  • Сохраняйте токен на сервере вместе с ID пользователя, платформой и датой обновления.
  • Обновляйте токен при каждом вызове onNewToken или его аналога на iOS.
  • У одного пользователя может быть несколько устройств — храните список токенов.
  • Удаляйте токены, на которые FCM возвращает ошибку о незарегистрированном устройстве.
  • При выходе из аккаунта отвязывайте токен от пользователя.

Шаг 4. Отправка с сервера

Используйте FCM HTTP v1 API — старый legacy API отключён. Проще всего через Firebase Admin SDK с сервисным аккаунтом:

import { initializeApp, applicationDefault } from "firebase-admin/app";
import { getMessaging } from "firebase-admin/messaging";

initializeApp({ credential: applicationDefault() });

await getMessaging().send({
  token: deviceToken,
  notification: { title: "Заказ отправлен", body: "Отследите доставку в приложении" },
  data: { screen: "order", orderId: "1042" },
});
  • notification — заголовок и текст, система показывает их сама.
  • data — ваши ключи для логики, например экран для перехода.

Ключ сервисного аккаунта храните в секретах сервера, а не в репозитории и не в приложении.

Шаг 5. Топики

Топик — это рассылка всем, кто на него подписан, без хранения токенов:

  • клиент вызывает subscribeToTopic("news");
  • сервер отправляет сообщение с topic: "news" вместо token.

Топики хороши для публичных категорий (новости, акции). Для персональных уведомлений используйте токены.

Шаг 6. Проверка доставки

  1. Скопируйте токен устройства из логов.
  2. В Firebase Console откройте Messaging, создайте уведомление и нажмите Send test message, вставив токен.
  3. Проверьте три состояния: приложение открыто, свернуто, закрыто.
  4. iOS проверяйте на реальном устройстве.

Если сообщение не пришло: проверьте разрешение на уведомления, загруженный APNs-ключ, совпадение Bundle ID и package name, а также режим экономии энергии на Android.

Частые вопросы

Чаще всего не загружен APNs-ключ, неверны Key ID или Team ID, не включена capability Push Notifications или пользователь не дал разрешение. Проверьте эти пункты по порядку.

Поможем с этим

Если хотите не разбираться самим, а получить результат — этим мы занимаемся каждый день.

Обсудить проект

Читайте также

Есть идея или задача? Расскажите нам

Ответим в течение рабочего дня и предложим решение. Консультация бесплатная.