将FCM从Firestore发送到Android应用程序会怎样?

时间:2019-06-06 17:46:21

标签: android firebase google-cloud-firestore firebase-cloud-messaging

这是我到目前为止所拥有的:

  1. 在Android上,用户登录并更改Firestore文档。
  2. Firestore文档已更新
  3. 云功能被触发
  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)`

2 个答案:

答案 0 :(得分:0)

如果要向设备发送消息,则需要编写代码以在应用程序中收集设备令牌,然后将其存储或发送到后端。所有这些都不会自动发生。

答案 1 :(得分:0)

我知道这个问题被问到已经一年左右了,但这可能会对某人有所帮助。

要将通知发送到设备,您应该在Firestore中进行另一个收集,在其中存储用户的所有令牌,然后可以从那里获取令牌以将通知发送给任何人。