Что входит в отправку FCM из Firestore в приложение для Android? - PullRequest
0 голосов
/ 06 июня 2019

Вот что у меня есть:

  1. На Android пользователь входит в систему и вносит изменения в документ Firestore.
  2. Документ Firestore обновляется
  3. cloudфункция активирована
  4. облачная функция отправляет сообщение на устройство (устройства) с использованием токенов устройства
  5. В Android FirebaseMessagingService должна получать сообщение, но не отправляет его.

Я подозреваючасть, которую я пропускаю, - регистрация токена устройства.Поскольку моим сервером является Firebase, а мои пользователи входят в систему через Firebase, нужно ли предпринимать дополнительные шаги для отправки токена устройства в Firebase, чтобы моя облачная функция могла получить к нему доступ?Другими словами, я сам храню их в Firestore или они входят в стандартную комплектацию некоторой «пользовательской» коллекции, контролируемой Firebase?Для большего контекста я адаптировал свою облачную функцию из примера, который я нашел в Интернете:

ФУНКЦИЯ ОБЛАКА:

exports.coolThingIsHappening = functions.firestore.document("coolstuf/{userId}")
    .onWrite(async (change, context) => {
        console.log("coolThingIsHappening is triggered");
        const userId = context.params.userId;
        const after = change.after.data();
        const payload = {
            data: after
        }
        const tokensSnapshot = await admin.database()
            .ref(`/users/${userId}/notificationTokens`).once('value');
        if (!tokensSnapshot.hasChildren()) {
            const logMsg = `user ${userId} has no notification tokens.`
            console.log(logMsg)
            return logMsg;
        }
        console.log("FCM tokens found")
        const tokens = Object.keys(tokensSnapshot.val());
        const response = await admin.messaging().sendToDevice(tokens, payload);
        const tokensToRemove: Promise<void>[] = [];
        console.log(`response results: ${response.results.length}`)
        response.results.forEach((result, index) => {
            console.log(`fcm sent: ${result.messageId}`)
            const error = result.error;
            if (error!.code === 'messaging/invalid-registration-token' ||
                error!.code === 'messaging/registration-token-not-registered') {
                tokensToRemove.push(tokensSnapshot.ref.child(tokens[index]).remove());
            }
        });
        return Promise.all(tokensToRemove);
    });

РЕДАКТИРОВАТЬ

Я продолжилсохранить токены fcm в Firestore.Любая идея, как преобразовать код выше из database -центрических в firestore -центрических.У меня проблемы.Код Android:

val data = mapOf("token" to it)
val collectionName = "users/${uid}/deviceTokens/"
   FirebaseFirestore.getInstance().collection(collectionName).document()
  .set(data)`

1 Ответ

0 голосов
/ 06 июня 2019

Если вы хотите отправлять сообщения на устройства, вам нужно будет написать код для сбора токенов устройства в вашем приложении, а также сохранить их или отправить на сервер. Ничего из этого не происходит автоматически.

...