使用令牌和云函数实现FCM的最佳方法



我有一个应用程序,通过电子邮件和密码进行用户身份验证-这一切都很好。

通过使用该应用程序,用户将输入各种日期,并且在这些日期我想向该用户发送通知(例如他们的生日)。

目前,我将用户UID和他们输入的日期存储到一个Collection(假设为'dateEntires')中。我正在尝试为cron作业编写一个云函数,以便每天检查Collection,如果日期与今天匹配,则向用户(通过其UID)发送通知。我遇到的问题是注册令牌。

我已经读到,我需要根据他们的注册令牌向用户发送通知。这我可能会设置-但我的问题是,如果他们的注册令牌改变(即他们卸载和重新安装应用程序)会发生什么?

为了实现这一点,我应该吗?

  1. 将注册令牌存储在身份验证中,每次用户打开应用程序并在必要时进行更新时检查这一点-云功能可以检查集合,如果日期与今天匹配,则它将使用集合中的UID在身份验证表中查找注册令牌以发送消息

  2. 将注册令牌和UID存储到dateEntries中,每次用户打开应用程序时,检查'dateEntries'中所有记录中该用户UID的注册令牌并在需要的地方更新

或者有更好的方法?

根据他们的(固定)UID而不是他们的(可变)注册令牌发送个性化通知要容易得多-但我被告知这是不可能的(?)

不幸的是,由于Firebase如何发送到各个设备的工作方式,您确实需要注册令牌,如您所说。

当你说"在认证",这是否意味着你有另一个集合在firebase名为"认证",或者你是在谈论保存到用户的firebase认证声明?我强烈建议不要使用后者,因为它会被放入auth令牌中。

我建议的是在Firebase中对UID进行单独的集合,并将注册令牌保存在那里。它可以被称为Authentication"或";Users"或者任何对你来说最有意义的地方,我将在那里存储任何特定于用户的数据。

同样,对于你的事件,我认为你可能想要一个像events/${User-ID}/${Event-ID}/这样的结构。

您需要在用户每次打开应用程序时将令牌保存到CloudFirestore数据库。然后在Cloud functions中查询令牌,并使用如下代码向特定用户发送通知:

//here you will query the specific user to get the token
var token = //get the token from Firestore
var payload = admin.messaging.MessagingPayload = {

notification: {
title: senderName,
body: message,
icon: 'your-icon-url',
click_action: 'FLUTTER_NOTIFICATION_CLICK',
},

"data": {
"sender": sender,
"senderName": senderName,
"gender": gender,
"fullName": fullName,
"message": message
}

admin.messaging().sendToDevice(
token,
payload,


{
contentAvailable: true,
priority: "high",
},
);