Files
mobile-android/docs/FCM_TODO.md
k1ngsterr1 569aa34432 feat: Add comprehensive encryption architecture documentation for Rosette Messenger
feat: Implement Firebase Cloud Messaging (FCM) integration documentation for push notifications

docs: Outline remaining tasks for complete FCM integration in the project

fix: Resolve WebSocket connection issues after user registration
2026-01-17 19:04:05 +05:00

7.0 KiB
Raw Permalink Blame History

🔔 Что еще нужно для полной интеграции 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:

    # 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)

// Сервер должен сохранить 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-уведомлений

Когда приходит новое сообщение для пользователя:

// Псевдокод для сервера
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 пример)

// На сервере установить:
// 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 Проверка получения токена

# После запуска приложения проверить в 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. Разные типы уведомлений:

    // Можно добавить в PacketPushToken поле notification_settings
    data class NotificationSettings(
        val showPreview: Boolean = true,  // Показывать текст сообщения
        val vibrate: Boolean = true,
        val sound: Boolean = true
    )
    
  3. Проверка валидности токена:

    • Сервер может проверять что токен валиден через Firebase Admin API
    • Удалять невалидные токены из БД

📝 Чеклист готовности

  • Android: Firebase SDK добавлен
  • Android: FCM Service создан
  • Android: PacketPushToken добавлен
  • 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

📚 Полезные ссылки