feat: Integrate Firebase Cloud Messaging for push notifications; add service to handle token and message reception
This commit is contained in:
207
FCM_TODO.md
Normal file
207
FCM_TODO.md
Normal 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)
|
||||
Reference in New Issue
Block a user