Архитектура push-уведомлений
Push-уведомления работают через облако: сервер отправляет уведомление в Firebase (или APNs для iOS), а Firebase доставляет его на устройство. Приложение регистрируется для получения токена и подписывается на топик.
▸Схема работы
Приложение запрашивает разрешение на уведомления
Получает FCM-токен
Токен отправляется на сервер
Сервер отправляет уведомление через FCM
Устройство получает и отображает уведомление
Установка Firebase
1npm install @react-native-firebase/app2npm install @react-native-firebase/messaging3npm install @notifee/react-native
▸Конфигурация Android
В android/app/build.gradle:
1apply plugin: 'com.google.gms.google-services'
В android/build.gradle:
1classpath 'com.google.gms:google-services:4.4.0'
▸Конфигурация iOS
1cd ios && pod install
В ios/YourApp/AppDelegate.mm:
1#import <Firebase.h>2- (BOOL)application:(UIApplication *)application3 didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {4 [FIRApp configure];5 // ...6}
Регистрация на уведомления
1import messaging from '@react-native-firebase/messaging';2import notifee, { AndroidImportance } from '@notifee/react-native';34async function requestPermission() {5 const authStatus = await messaging().requestPermission();6 const enabled =7 authStatus === messaging.AuthorizationStatus.AUTHORIZED ||8 authStatus === messaging.AuthorizationStatus.PROVISIONAL;910 if (enabled) {11 console.log('Разрешение получено');12 const token = await messaging().getToken();13 console.log('FCM Token:', token);14 // Отправьте токен на сервер15 }16}
Создание каналов уведомлений (Android)
1async function createChannels() {2 await notifee.createChannel({3 id: 'default',4 name: 'Основные уведомления',5 importance: AndroidImportance.HIGH,6 });78 await notifee.createChannel({9 id: 'messages',10 name: 'Сообщения',11 importance: AndroidImportance.HIGH,12 vibration: true,13 });14}
Обработка уведомлений
▸Когда приложение на переднем плане
1messaging().onMessage(async remoteMessage => {2 await notifee.displayNotification({3 title: remoteMessage.notification.title,4 body: remoteMessage.notification.body,5 android: {6 channelId: 'default',7 pressAction: { id: 'default' },8 },9 });10});
▸Когда приложение на фоне
1messaging().setBackgroundMessageHandler(async remoteMessage => {2 console.log('Фоновое уведомление:', remoteMessage);3});
▸При нажатии на уведомление
1notifee.onForegroundEvent(({ type, detail }) => {2 if (type === 1) { // PRESS3 const { notification } = detail;4 // Навигация к экрану5 }6});78// При запуске приложения через уведомление9const initialNotification = await notifee.getInitialNotification();10if (initialNotification) {11 // Навигация к соответствующему экрану12}
Отправка уведомлений с сервера
1// Серверная часть (Node.js + Firebase Admin)2const admin = require('firebase-admin');3admin.initializeApp({4 credential: admin.credential.cert(serviceAccount),5});67const message = {8 notification: {9 title: 'Новое сообщение',10 body: 'У вас новое сообщение от Ивана',11 },12 data: {13 screen: 'Chat',14 chatId: '123',15 },16 token: deviceToken,17};1819await admin.messaging().send(message);
Тестирование
adb shell am start -a android.intent.action.VIEW -d "fcm://..."Заключение
Push-уведомления — важный канал коммуникации с пользователями. Firebase Cloud Messaging предоставляет кросс-платформенное решение и поддерживает обработку на переднем и заднем плане. Правильная настройка разрешений, каналов и обработки уведомлений критична для хорошего пользовательского опыта.