当 uid 更改时,为用户订阅 Firebase 中的主题
Subscribe a user to a topic in Firebase when uid has changed
我的问题是:
当我为用户订阅聊天时,假设聊天的 ID 为 "xDs50Yss70",用户保持订阅状态,而用户的 Firebase uid 没有改变。
但是,当用户的 Firebase uid 发生变化时,例如当用户删除应用程序并再次下载时,用户不再订阅聊天,以及 he/she 可能拥有的其他订阅。
我使用此功能在首次创建聊天时为用户订阅聊天
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}`)
}).
我能想到两种可能的解决方案。他们都喜欢在调用 onNewToken 方法时再次设置订阅,或者对于以前版本的 FCM onTokenRefresh 方法。
所以您需要做的是获取用户订阅的主题列表,然后为每个主题再次subscribeToTopic。如果您的服务器上有它们,您可以从那里获取它们,或者您可以将它们本地存储在用户的设备上(即 SharedPreferences、数据库等)检索它们并再次设置它们。
当用户首次使用电子邮件+密码或社交提供商之一(例如 Facebook、Google 等)登录 Firebase 身份验证时,系统会为其帐户确定一个唯一的 UID。因为此 UID 在那之后保持不变,直到您删除他们的帐户。这意味着如果用户卸载并重新安装该应用程序,他们将在登录时获得相同的 UID。
这是 Frank 回答的扩展,基于您使用 Token 更新的问题。
A Firebase ID 令牌 仅在发生以下情况之一时过期:
- 用户已删除
- 用户被禁用
- 检测到用户的主要帐户更改。这包括密码或电子邮件地址更新等事件。
这不是你的情况,所以,在这一点上,你需要做的是 REVOKE 刷新令牌。
Revoke refresh tokens
You might revoke a user's existing refresh token
when a user reports a lost or stolen device. Similarly, if you
discover a general vulnerability or suspect a wide-scale leak of
active tokens, you can use the listUsers API to look up all users and
revoke their tokens for the specified project.
Password resets also revoke a user's existing tokens; however, the
Firebase Authentication backend handles the revocation automatically
in that case. On revocation, the user is signed out and prompted to
reauthenticate.
有关实施和文档的完整详细信息,请参阅文档 here。 (冗长)
您所指的令牌是 device registration token。它可以在以下事件中发生变化:
- 应用程序删除实例 ID
- 该应用已在新设备上恢复
- 用户uninstalls/reinstalls应用程序
- 用户清除应用数据
在每种情况下,您都需要获取新的注册令牌,并订阅您关心的主题。希望以上所有事件对于任何给定用户来说都是罕见的,因此您不必经常这样做。
现在您似乎代表了一个带有主题的聊天(我假设这就像您应用中的特定对话或聊天室)。因此,您的主题可能因用户而异。这意味着您还必须独立地跟踪每个用户的主题。为每个用户存储 chats/topics 的列表,由他们在数据库中的唯一 UID 键控。 UID 自始至终保持不变,因此您不必担心它们会随时间变化。
我的问题是: 当我为用户订阅聊天时,假设聊天的 ID 为 "xDs50Yss70",用户保持订阅状态,而用户的 Firebase uid 没有改变。 但是,当用户的 Firebase uid 发生变化时,例如当用户删除应用程序并再次下载时,用户不再订阅聊天,以及 he/she 可能拥有的其他订阅。
我使用此功能在首次创建聊天时为用户订阅聊天
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}`)
}).
我能想到两种可能的解决方案。他们都喜欢在调用 onNewToken 方法时再次设置订阅,或者对于以前版本的 FCM onTokenRefresh 方法。
所以您需要做的是获取用户订阅的主题列表,然后为每个主题再次subscribeToTopic。如果您的服务器上有它们,您可以从那里获取它们,或者您可以将它们本地存储在用户的设备上(即 SharedPreferences、数据库等)检索它们并再次设置它们。
当用户首次使用电子邮件+密码或社交提供商之一(例如 Facebook、Google 等)登录 Firebase 身份验证时,系统会为其帐户确定一个唯一的 UID。因为此 UID 在那之后保持不变,直到您删除他们的帐户。这意味着如果用户卸载并重新安装该应用程序,他们将在登录时获得相同的 UID。
这是 Frank 回答的扩展,基于您使用 Token 更新的问题。
A Firebase ID 令牌 仅在发生以下情况之一时过期:
- 用户已删除
- 用户被禁用
- 检测到用户的主要帐户更改。这包括密码或电子邮件地址更新等事件。
这不是你的情况,所以,在这一点上,你需要做的是 REVOKE 刷新令牌。
Revoke refresh tokens
You might revoke a user's existing refresh token when a user reports a lost or stolen device. Similarly, if you discover a general vulnerability or suspect a wide-scale leak of active tokens, you can use the listUsers API to look up all users and revoke their tokens for the specified project.
Password resets also revoke a user's existing tokens; however, the Firebase Authentication backend handles the revocation automatically in that case. On revocation, the user is signed out and prompted to reauthenticate.
有关实施和文档的完整详细信息,请参阅文档 here。 (冗长)
您所指的令牌是 device registration token。它可以在以下事件中发生变化:
- 应用程序删除实例 ID
- 该应用已在新设备上恢复
- 用户uninstalls/reinstalls应用程序
- 用户清除应用数据
在每种情况下,您都需要获取新的注册令牌,并订阅您关心的主题。希望以上所有事件对于任何给定用户来说都是罕见的,因此您不必经常这样做。
现在您似乎代表了一个带有主题的聊天(我假设这就像您应用中的特定对话或聊天室)。因此,您的主题可能因用户而异。这意味着您还必须独立地跟踪每个用户的主题。为每个用户存储 chats/topics 的列表,由他们在数据库中的唯一 UID 键控。 UID 自始至终保持不变,因此您不必担心它们会随时间变化。