Гид по технологиям

Руководство по push‑уведомлениям Firebase в React

8 min read Web‑разработка Обновлено 14 Dec 2025
Push‑уведомления Firebase в React — подробное руководство
Push‑уведомления Firebase в React — подробное руководство

Кратко

Краткое руководство по настройке push‑уведомлений в React с использованием Firebase Cloud Messaging (FCM). Описаны регистрация проекта, генерация VAPID‑ключей, конфигурация клиента и service worker, обработка разрешений, тестирование, безопасность и отладка.

Зачем нужны push‑уведомления

Push‑уведомления позволяют приложениям отправлять своевременные обновления, оповещения и персонализированные сообщения прямо на устройства пользователей — даже когда приложение не активно. Для веб‑приложений браузер принимает уведомление и перенаправляет его в зарегистрированное приложение (через service worker), что обеспечивает непрерывную вовлечённость и мгновенную связь с пользователем.

Важно: уведомления — это не замена внутренней логики синхронизации данных. Они подходят для оповещений о событиях, важных для пользователя (новые сообщения, системные алерты), но не для регулярной передачи объёма данных.

Что вы получите, пройдя шаги этого руководства

  • Рабочую конфигурацию Firebase в React‑приложении.
  • Настроенный service worker для фоновой обработки уведомлений.
  • Обработчик разрешений и получение клиентского токена.
  • Примеры отправки тестовых сообщений из консоли и через HTTP API.
  • Шаблоны для контроля качества, безопасности и соответствия приватности.

Введение в ключевые понятия

  • FCM (Firebase Cloud Messaging): сервис Google для отправки push‑уведомлений на веб и мобильные платформы.
  • VAPID‑ключ (Application Server Key): пара ключей для Web Push, используемая для валидации сервера отправителя.
  • Клиентский токен (registration token): уникальный идентификатор экземпляра приложения/браузера для адресной доставки сообщений.
  • Service worker: фоновый скрипт браузера, который может получать и показывать уведомления, даже если вкладка закрыта.

Требования и проверки перед началом

  • Установленная Node.js и npm/yarn.
  • Созданный React‑проект (create‑react‑app или аналог).
  • Доступ к Firebase‑консоли (аккаунт Google).
  • HTTPS (локально можно использовать localhost). Браузеры требуют защищённого соединения для push.

Шаг 1 — Создание Firebase‑проекта

  1. Перейдите в Firebase Developer Console и войдите под Google‑аккаунтом.
  2. Нажмите кнопку «Go to Console» и затем «Create a project».

Кнопка «Create a project» на странице обзора Firebase Developer Console

  1. Укажите имя проекта, примите условия (если требуется) и дождитесь создания.
  2. На странице обзора проекта зарегистрируйте веб‑приложение: нажмите иконку Web, введите имя и подтвердите регистрацию.

Иконка Web для регистрации приложения на странице обзора проекта Firebase

  1. После регистрации вы получите объект конфигурации Firebase — сохраните его, он потребуется в коде.

Шаг 2 — Конфигурирование Firebase Cloud Messaging (FCM)

  1. Откройте «Project settings» в консоли Firebase.

Кнопка «Project settings» на странице консоли Firebase

  1. Перейдите на вкладку «Cloud Messaging».

Вкладка «Cloud Messaging» в настройках проекта Firebase и другие вкладки

  1. В разделе «Web configuration» сгенерируйте пару ключей (VAPID key pair). Нажмите «Generate key pair» и сохраните публичный ключ и приватный ключ — публичный вставляется в клиентскую конфигурацию при вызове getToken.

Кнопка «Generate key pair» в разделе Web configuration на странице Cloud Messaging

Важно: приватный ключ храните на стороне сервера и не выкладывайте в клиентский код.

Шаг 3 — Создание React‑приложения и установка зависимостей

Создайте проект (если ещё нет) и установите необходимые пакеты:

npx create-react-app my-push-app
cd my-push-app
npm install firebase react-hot-toast

Пакеты:

  • firebase — для интеграции с FCM.
  • react-hot-toast — для локальных toast‑уведомлений в интерфейсе (опционально).

Шаг 4 — Конфигурация Firebase в коде клиента

В директории src создайте файл firebase.js и вставьте конфигурацию проекта. Пример:

import { initializeApp } from "firebase/app";
import { getMessaging, getToken, onMessage } from 'firebase/messaging';

const firebaseConfig = {
  apiKey: "",
  authDomain: "",
  projectId: "",
  storageBucket: "",
  messagingSenderId: "",
  appId: ""
};

const app = initializeApp(firebaseConfig);
const messaging = getMessaging(app);

export { messaging, getToken, onMessage };

Замените поля firebaseConfig конфигурацией из Firebase Console.

Шаг 5 — Запрос разрешения на получение уведомлений и получение токена

Добавьте в firebase.js функцию для запроса разрешений и получения регистрационного токена:

export const requestPermission = async () => {
  console.log("Запрос разрешения на уведомления...");
  const permission = await Notification.requestPermission();

  if (permission === 'granted') {
    console.log('Разрешение получено');
    try {
      const currentToken = await getToken(messaging, { vapidKey: 'ВАШ_PUBLIC_VAPID_KEY' });
      if (currentToken) {
        console.log('Client Token: ', currentToken);
        // Сохраните токен на сервере или в localStorage по вашему усмотрению
      } else {
        console.log('Не удалось получить токен регистрации.');
      }
    } catch (err) {
      console.log('Ошибка при получении токена:', err);
    }
  } else {
    console.log('Разрешение на уведомления отклонено пользователем.');
  }
};

// Вызовите requestPermission() из компонента приложения при первом рендере

Ключевой момент: в опции getToken передаётся публичный VAPID‑ключ, который вы сгенерировали в настройках Cloud Messaging.

Шаг 6 — Слушатель входящих сообщений в фокусе приложения

Чтобы обработать уведомления, когда приложение открыто и в фокусе, определите onMessageListener:

export const onMessageListener = () =>
  new Promise((resolve) => {
    onMessage(messaging, (payload) => {
      resolve(payload);
    });
  });

Пример использования в React‑компоненте ниже.

Шаг 7 — Service worker для фоновой обработки уведомлений

FCM для веба требует наличия service worker, который зарегистрирован в корне сайта (в папке public). Создайте public/firebase-messaging-sw.js со следующим кодом:

importScripts("https://www.gstatic.com/firebasejs/9.0.0/firebase-app-compat.js");
importScripts("https://www.gstatic.com/firebasejs/9.0.0/firebase-messaging-compat.js");

// Вставьте ваш firebaseConfig сюда как в основном приложении
const firebaseConfig = {
  // configuration information
};

firebase.initializeApp(firebaseConfig);
const messaging = firebase.messaging();

messaging.onBackgroundMessage(function(payload) {
  console.log('Received background message ', payload);
  const notificationTitle = payload.notification.title;
  const notificationOptions = {
    body: payload.notification.body,
  };

  self.registration.showNotification(notificationTitle, notificationOptions);
});

Service worker позволяет показывать уведомления, даже когда вкладка закрыта.

Важно: путь файла должен быть доступен по корню сайта: /firebase-messaging-sw.js.

Шаг 8 — Компонент для отображения уведомлений в интерфейсе

Создайте src/components/Notification.js:

import React, { useState, useEffect } from 'react';
import { Toaster, toast } from 'react-hot-toast';
import { requestPermission, onMessageListener } from '../firebase';

function Notification() {
  const [notification, setNotification] = useState({ title: '', body: '' });

  useEffect(() => {
    requestPermission();
    const unsubscribe = onMessageListener().then((payload) => {
      setNotification({
        title: payload?.notification?.title,
        body: payload?.notification?.body,
      });
      toast.success(`${payload?.notification?.title}: ${payload?.notification?.body}`, {
        duration: 60000,
        position: 'top-right',
      });
    });

    return () => {
      // onMessageListener возвращает промис; при необходимости добавьте логику отписки
      if (unsubscribe && typeof unsubscribe.catch === 'function') {
        unsubscribe.catch((err) => console.log('failed: ', err));
      }
    };
  }, []);

  return (
    
); } export default Notification;

И импортируйте компонент в App.js:

import './App.css';
import Notification from './components/Notification';

function App() {
  return (
    
); } export default App;

Шаг 9 — Тестирование в браузере и отправка тестового сообщения

  1. Запустите dev‑сервер: npm start.
  2. Откройте http://localhost:3000 — браузер должен показать запрос на разрешение уведомлений.

Всплывающее окно запроса разрешения на уведомления в браузере

  1. Нажмите «Allow». В консоли браузера должен появиться «Client Token». Скопируйте его.
  2. В Firebase Console откройте Cloud Messaging → Create your first campaign.

Кнопка «Create your first campaign» в Firebase Cloud Messaging

  1. Выберите Firebase Notification messages, заполните заголовок и текст, выберите Send test message и вставьте клиентский токен.

Форма создания push-уведомления в Firebase: поля заголовка и сообщения

  1. Нажмите Test — уведомление придёт в приложение (в активной вкладке — onMessage, в фоне — service worker).

Окно тестовой отправки push-уведомления с полем для клиентского токена

Отправка сообщений через HTTP API (пример)

Ниже пример использования старого (legacy) API для отправки push‑уведомления c сервера. Для production рекомендуется HTTP v1 API с OAuth‑токеном.

Пример curl с legacy серверным ключом (Server key) — замените SERVER_KEY и CLIENT_TOKEN:

curl -X POST -H "Authorization: key=SERVER_KEY" -H "Content-Type: application/json" -d '{
  "to": "CLIENT_TOKEN",
  "notification": {
    "title": "Заголовок уведомления",
    "body": "Текст уведомления"
  }
}' https://fcm.googleapis.com/fcm/send

Для HTTP v1 (рекомендуется) использование требует создания сервисного аккаунта и получения access token. Это сложнее, но безопаснее — документация Google описывает шаги.

Частые проблемы и их решения

  • Токен не генерируется: проверьте VAPID‑ключ, корректность firebaseConfig, HTTPS/localhost и наличие service worker в корне.
  • Разрешение отклонено: объясните пользователю в UI зачем нужны уведомления и предложите инструкции по повторному включению в настройках браузера.
  • Уведомления не показываются в фоне: убедитесь, что firebase-messaging-sw.js доступен по корню и правильно инициализирован, и что версия библиотек compat соответствует.
  • Различия между браузерами: Chrome и Edge обычно поддерживают Web Push; Safari имеет свои правила (Web Push поддерживается только в macOS/iOS с некоторыми ограничениями).

Безопасность и хранение ключей

  • Публичный VAPID‑ключ используется в клиенте; приватный VAPID‑ключ храните на сервере.
  • Серверный ключ (legacy Server key) или OAuth‑токены должны храниться в защищённом хранилище и не попадать клиенту.
  • Ограничьте доступ к API для отправки уведомлений и ведите аудит действий по отправке.

Приватность и соответствие (GDPR и др.)

  • Push‑уведомления считаются персональными данными, если содержат идентификаторы или персональную информацию.
  • Дайте пользователю понятное согласие и возможность отписаться от уведомлений.
  • Не храните персональные токены и данные без необходимости; если храните — обеспечьте процессы удаления по запросу.

Модели зрелости внедрения уведомлений (примерные уровни)

  1. Базовый: одна глобальная категория уведомлений (включено/выключено). Минимальная интеграция.
  2. Персонализация: категории по типам (события, реклама, транзакции), управление на уровне профиля.
  3. Контекстная доставка: сегментация, A/B тесты, адаптивное расписание доставки.
  4. Автоматизация: машинное обучение для оптимального времени доставки и контента.

Критерии приёмки

  • Клиент успешно запрашивает и получает разрешение от пользователя.
  • Клиент получает клиентский токен и регистрирует его на сервере.
  • Уведомления корректно отображаются при активной сессии (onMessage).
  • Уведомления корректно отображаются фоновым service worker (background).
  • Тестовое сообщение из Firebase Console доставляется на указанный клиентский токен.

Роль‑ориентированные чек‑листы

Разработчик:

  • Вставил корректный firebaseConfig и VAPID‑ключ.
  • Создал firebase-messaging-sw.js в public и проверил путь.
  • Обработал отказ пользователя от разрешения.

QA:

  • Протестировал получение токена в разных браузерах.
  • Проверил показ уведомлений в фокусе и в фоне.
  • Проверил поведение при отказе в разрешении и при отписке.

Product/PM:

  • Определил категории уведомлений и частоту отправки.
  • Обеспечил пользовательский интерфейс управления подписками.

Риск‑матрица и смягчения

  • Неправильное хранение ключей → компрометация рассылок. Смягчение: хранить ключи в секретном менеджере.
  • Перегрузка пользователей уведомлениями → отписки/отток. Смягчение: лимиты, логика частоты, сегментация.
  • Неправильный контент → юридические риски. Смягчение: превью и модерация кампаний.

Тестовые сценарии и критерии приёмки

  • TC1: Пользователь разрешил уведомления → при отправке тестового сообщения отображается toast в приложении.
  • TC2: Пользователь отклонил уведомления → приложение не показывает запрос снова без явного действия.
  • TC3: Service worker получает background‑notification → проверяем отображение системного уведомления.
  • TC4: Повторная регистрация приложения → токен обновился или корректно обновлён на сервере.

Альтернативные подходы и когда FCM не подходит

  • Если требуется приватность end‑to‑end для сообщений — push через FCM не обеспечивает E2E‑шифрования по умолчанию.
  • Для офлайн‑синхронизации больших объёмов данных лучше использовать периодическую синхронизацию и background sync, а не push для передачи груза.
  • Альтернативы: собственная реализация Web Push (потребует настройки VAPID и push‑серверов), сервисы третьих сторон (OneSignal, Pusher Beams) — они добавляют удобства, но вводят третью сторону.

Подсказки по миграции и совместимости

  • При миграции с legacy API на HTTP v1 подготовьте сервисный аккаунт и настройте OAuth Credentials.
  • При обновлении библиотек Firebase проверьте breaking changes в changelog и тестируйте service worker.

Короткая методология внедрения (6 шагов)

  1. План: определите сценарии уведомлений и правила подписки.
  2. Настройка Firebase: проект, веб‑app, VAPID‑ключ.
  3. Клиент: внедрите requestPermission, получение токена, onMessage.
  4. Service worker: разместите в public и протестируйте background messages.
  5. Сервер: храните токены, реализуйте отправку через HTTP v1 или управляйте рассылкой через консоль.
  6. QA/Мониторинг: тесты, логирование ошибок, отслеживание отказов и доставок.

Сниппеты и шпаргалка

  • Получение токена:
const token = await getToken(messaging, { vapidKey: 'ВАШ_PUBLIC_VAPID_KEY' });
  • Отправка тестового curl (legacy): см. раздел выше.

  • Проверка наличия service worker:

if ('serviceWorker' in navigator) {
  navigator.serviceWorker.register('/firebase-messaging-sw.js')
    .then(reg => console.log('Service Worker registered', reg))
    .catch(err => console.log('SW registration failed', err));
}

Советы по UX и уведомлениям

  • Предлагайте пользователю контекст перед запросом разрешения (объясните, зачем вы просите).
  • Позвольте пользователю выбрать категории уведомлений.
  • Не злоупотребляйте частотой — уведомления должны приносить пользу.

Краткое резюме

Push‑уведомления через Firebase Cloud Messaging — мощный инструмент для повышения вовлечённости пользователей в веб и мобильных приложениях. Правильная настройка включает конфигурацию проекта в Firebase, генерацию VAPID‑ключей, реализацию service worker, корректную обработку разрешений и безопасное хранение серверных ключей. Тестируйте в разных браузерах и следите за приватностью и частотой рассылок.

Полезные ссылки и документация

  • Официальная документация Firebase Cloud Messaging
  • Документация по Web Push и VAPID

Если вам нужны готовые шаблоны серверной отправки (Node.js/Express), пример миграции на HTTP v1 API или готовый playbook для запуска кампании — напишите, и я подготовлю детализированный набор файлов и команд.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

VBScript: ODBC‑подключение к базе
Базы данных

VBScript: ODBC‑подключение к базе

Как найти Apple Pencil: руководство и советы
Руководство

Как найти Apple Pencil: руководство и советы

Установка GPMC в Windows 10
Windows

Установка GPMC в Windows 10

Как установить .NET Framework на Windows 10
Windows

Как установить .NET Framework на Windows 10

Импорт закладок в Google Chrome
Браузеры

Импорт закладок в Google Chrome

Воспоминания Google Photos на новой вкладке Chrome
Руководство

Воспоминания Google Photos на новой вкладке Chrome