208 lines
7.0 KiB
Markdown
208 lines
7.0 KiB
Markdown
# 🔔 Что еще нужно для полной интеграции 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)
|