使用令牌和 Cloud Function 的最佳 FCM 方法

Best approach to FCM with tokens and a Cloud Function

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

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

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

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

为了实现这个我应该吗?

  1. 将注册令牌存储在身份验证中,每次用户打开应用程序时检查它并在必要时更新 - 云功能可以检查集合,如果日期与今天匹配,那么它将使用 Collection 中的 UID 在 Authentication table 中找到 Registration Token 以发送消息

  2. 将Registration Token和UID存储到dateEntries中,每次用户打开应用时,检查'dateEntries'中所有记录中的Registration Token是否为这个用户的UID,并在需要的地方更新

或者有更好的方法吗?

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

您需要在用户每次打开应用时将令牌保存到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",
                },
                 );

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

当您说“在身份验证中”时,这是否意味着您在 firebase 中有另一个名为“身份验证”的集合,或者您是在谈论保存到用户的 Firebase 身份验证声明中?我强烈建议不要使用后者,因为后者会被放入授权令牌中。

我建议在 Firebase 中创建一个以 UID 为键的单独集合,并将注册令牌保存在那里。这可以称为“身份验证”或“用户”或任何对您来说最有意义的名称,这将是我存储任何用户特定数据的地方。

此外,对于您的活动,我认为您可能希望采用 events/${User-ID}/${Event-ID}/.

这样的结构