# 🔔 Что еще нужно для полной интеграции FCM (Push-уведомления) ## ✅ Уже реализовано 1. **Android клиент:** - ✅ Firebase SDK добавлен в dependencies - ✅ `RosettaFirebaseMessagingService` - обработка уведомлений - ✅ `MainActivity` - инициализация Firebase и отправка токена - ✅ Packet `PacketPushToken` (0x0A) для отправки токена на сервер - ✅ Разрешения `POST_NOTIFICATIONS` в AndroidManifest - ✅ Сервис зарегистрирован в манифесте 2. **Документация:** - ✅ `FCM_SETUP.md` с полной архитектурой и примерами - ✅ `google-services.json.example` - пример конфига ## ⚠️ Нужно сделать ### 1. Firebase Console Setup 1. **Получить google-services.json:** ```bash # 1. Зайти на https://console.firebase.google.com/ # 2. Создать/выбрать проект # 3. Добавить Android приложение # 4. Указать package name: com.rosetta.messenger # 5. Скачать google-services.json # 6. Положить в rosetta-android/app/ ``` 2. **Важно:** Файл `google-services.json` должен быть в gitignore (уже есть пример .example) ### 2. Серверная часть Нужно реализовать на сервере: #### 2.1 Обработка PacketPushToken (0x0A) ```kotlin // Сервер должен сохранить FCM токен для пользователя when (packetType) { 0x0A -> { // PacketPushToken val pushToken = PacketPushToken.deserialize(stream) // Сохранить в базе данных: // user_fcm_tokens: // - public_key (primary key) // - fcm_token (string) // - platform ("android") // - updated_at (timestamp) saveFcmToken( publicKey = pushToken.publicKey, fcmToken = pushToken.pushToken, platform = pushToken.platform ) } } ``` #### 2.2 Отправка Push-уведомлений Когда приходит новое сообщение для пользователя: ```kotlin // Псевдокод для сервера fun onNewMessage(toPublicKey: String, fromPublicKey: String, message: String) { // 1. Получить FCM токен получателя val fcmToken = getFcmToken(toPublicKey) ?: return // 2. Отправить уведомление через Firebase Admin SDK val notification = Message.builder() .setToken(fcmToken) .setNotification( Notification.builder() .setTitle(getSenderName(fromPublicKey)) .setBody(message) .build() ) .putData("sender_public_key", fromPublicKey) .putData("message", message) .build() FirebaseMessaging.getInstance().send(notification) } ``` #### 2.3 Firebase Admin SDK (Node.js пример) ```javascript // На сервере установить: // npm install firebase-admin const admin = require("firebase-admin"); const serviceAccount = require("./serviceAccountKey.json"); admin.initializeApp({ credential: admin.credential.cert(serviceAccount), }); async function sendPushNotification(fcmToken, senderName, messageText) { const message = { token: fcmToken, notification: { title: senderName, body: messageText, }, data: { sender_public_key: senderPublicKey, message: messageText, }, android: { priority: "high", notification: { sound: "default", channelId: "rosetta_messages", }, }, }; try { const response = await admin.messaging().send(message); console.log("✅ Push sent:", response); } catch (error) { console.error("❌ Push failed:", error); } } ``` ### 3. Тестирование #### 3.1 Проверка получения токена ```bash # После запуска приложения проверить в logcat: adb logcat -s RosettaFCM # Должно быть: 🔔 FCM token: ... ``` #### 3.2 Отправка тестового уведомления Через Firebase Console: 1. Зайти в Firebase Console → Cloud Messaging 2. Создать тестовое уведомление 3. Указать FCM token из logcat 4. Отправить #### 3.3 Проверка работы сервера 1. Запустить приложение 2. Убедиться что `PacketPushToken` отправился на сервер (логи протокола) 3. Отправить сообщение с другого аккаунта 4. Проверить что пришло push-уведомление ### 4. Оптимизации (опционально) 1. **Обработка обновления токена:** - FCM токен может меняться - `onNewToken()` в `RosettaFirebaseMessagingService` уже обрабатывает это - Сервер должен обновлять токен в БД 2. **Разные типы уведомлений:** ```kotlin // Можно добавить в PacketPushToken поле notification_settings data class NotificationSettings( val showPreview: Boolean = true, // Показывать текст сообщения val vibrate: Boolean = true, val sound: Boolean = true ) ``` 3. **Проверка валидности токена:** - Сервер может проверять что токен валиден через Firebase Admin API - Удалять невалидные токены из БД ## 📝 Чеклист готовности - [x] Android: Firebase SDK добавлен - [x] Android: FCM Service создан - [x] Android: PacketPushToken добавлен - [x] Android: MainActivity отправляет токен - [ ] **Firebase: google-services.json получен и добавлен** - [ ] **Сервер: Обработка PacketPushToken** - [ ] **Сервер: Firebase Admin SDK настроен** - [ ] **Сервер: Отправка push при новых сообщениях** - [ ] Тестирование: Получение токена работает - [ ] Тестирование: Push-уведомления приходят ## 🚀 Следующий шаг **Сейчас нужно:** 1. Получить `google-services.json` из Firebase Console 2. Добавить его в `rosetta-android/app/google-services.json` 3. Реализовать серверную часть (обработка PacketPushToken + отправка push) 4. Протестировать end-to-end ## 📚 Полезные ссылки - [FCM Android Setup](https://firebase.google.com/docs/cloud-messaging/android/client) - [Firebase Admin SDK](https://firebase.google.com/docs/admin/setup) - [FCM Server Protocols](https://firebase.google.com/docs/cloud-messaging/server)