feat: Integrate Firebase Cloud Messaging for push notifications; add service to handle token and message reception

This commit is contained in:
k1ngsterr1
2026-01-16 23:06:41 +05:00
parent 7750f450e8
commit 431e3755c6
14 changed files with 1317 additions and 234 deletions

207
FCM_TODO.md Normal file
View File

@@ -0,0 +1,207 @@
# 🔔 Что еще нужно для полной интеграции 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)