Files
mobile-android/FCM_TODO.md

208 lines
7.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 🔔 Что еще нужно для полной интеграции 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)