uid更改后,将用户订阅Firebase中的主题

时间:2018-08-30 20:01:52

标签: android firebase firebase-cloud-messaging firebase-admin

我的问题是: 当我为某个用户订阅聊天时,假设该聊天的ID为“ xDs50Yss70”,则用户保持订阅状态,而用户的Firebase uid并未更改。 但是,当用户的Firebase uid发生更改时(例如,当用户删除该应用程序并再次下载该应用程序时),该用户将不再订阅该聊天以及他/她可能拥有的其他订阅。

我使用此功能在首次创建聊天时向用户订阅聊天

function subscribeUserToATopic(registrationTokens, chatId) {
    return admin.messaging().subscribeToTopic(registrationTokens, chatId)
}

如我们所见,我们使用注册令牌来使用户订阅chatId,我使用从此代码(在客户端)中获得的注册令牌:

@Override
public void onNewToken(String newToken) {
    super.onNewToken(newToken);

    // Send the new token to Firestore
    sendTokenToDatabase(newToken);
}

我使用sendTokenToDatabase()将令牌发送到Firestore数据库,但是当用户删除该应用并重新安装该应用时,令牌就会更改...而且我不再可以使用此代码发送推送通知,因为用户的令牌已更改:

admin.messaging().sendToTopic(chatId, payload, options).then(() => {
        console.log(`Push notification sent to the user(s) subscribed to the ${chatId}`)
    }).

4 个答案:

答案 0 :(得分:1)

我可以想到两种可能的解决方案。当调用 onNewToken 方法时,它们都邀请再次设置订阅;对于FCM的早期版本,则使用 onTokenRefresh 方法。

因此,您需要做的是获取用户已订阅的主题列表,然后再次为每个主题 subscribeToTopic 。如果您将它们放在服务器上,则可以从那里获取它们,也可以将它们本地存储在用户设备上(例如,SharedPreferences,数据库等),以检索它们并再次设置它们。

答案 1 :(得分:1)

当用户首次使用电子邮件+密码或社交提供商之一(例如Facebook,Google等)登录Firebase身份验证时,将为其帐户确定唯一的UID。因为在那里,此UID在您删除其帐户之前一直保持不变。这意味着,如果用户卸载并重新安装该应用程序,则他们在登录时将获得相同的UID。

答案 2 :(得分:1)

这是Frank答案的扩展,并基于您对Token的更新问题。

Firebase ID令牌仅在以下情况之一发生时失效:

  1. 用户已删除
  2. 用户被禁用
  3. 检测到该用户的主要帐户更改。这包括密码或电子邮件地址更新之类的事件。

这不是您的情况,因此,此时,您需要撤销刷新令牌

  

撤销刷新令牌

     

您可能会撤消用户现有的刷新令牌   用户报告设备丢失或被盗时。同样地,如果您   发现一般漏洞或怀疑大规模泄漏   活动令牌,您可以使用listUsers API查找所有用户,并   撤销他们对指定项目的令牌。

     

密码重置还会撤消用户现有的令牌;然而   Firebase身份验证后端自动处理撤销   在这种情况下。吊销后,用户将注销并提示您   重新认证。

有关实现和文档的完整详细信息,请参见文档here。 (长)

答案 3 :(得分:1)

您所指的令牌是device registration token。在以下事件中可能会发生变化:

  • 该应用程序删除实例ID
  • 该应用已在新设备上还原
  • 用户卸载/重新安装应用程序
  • 用户清除应用数据

在每种情况下,您都需要获取新的注册令牌,并将其订阅到您关注的主题。希望上述所有事件对于任何给定用户来说都是罕见的,因此您不必经常这样做。

现在看来您代表一个带有主题的聊天(我想这就像您应用中的特定对话或聊天室一样)。因此,您的主题可能因用户而异。这意味着您还必须独立跟踪每个用户的主题。将每个用户的聊天/主题列表存储在数据库中,并以其唯一的UID作为关键字。 UID在整个过程中都是恒定不变的,因此您不必担心它们会随着时间变化。