firebase - 如何使“过期”的 Firebase 实例 ID 令牌无效
问题描述
AFAIK,Firebase 实例令牌将在以下 4 个条件下刷新:
应用删除实例 ID
应用程序在新设备上恢复
用户卸载/重新安装应用程序
用户清除应用数据
假设用户使用令牌 A 作为他的“FCM 地址”。每次他登录应用程序时,他都会将令牌 A 与该用户的 UUID 一起注册到 Firestore,以便可以向他发送用户特定的云消息。当他注销时,系统将向firestore发出请求以删除令牌A记录。
现在,当用户重新安装应用程序时,实例 id 会被刷新并生成一个新的 Token B。令牌 A 变得无用。不幸的是,如果用户在卸载之前没有注销,令牌 A 将永远保留在 Firestore 中。
任何解决方法或更明智的方法来处理这种情况?
解决方案
使您的令牌注册表保持最新需要两个步骤:
- 从您的应用程序代码中删除过时的令牌。
- 检查过时的令牌并在发送消息时将其删除。
您删除不再使用的令牌的方法是#1。
第二步是在尝试向其发送消息时收到messaging/invalid-registration-token
或响应时从注册表/数据库中删除令牌。functions-samples repomessaging/registration-token-not-registered
包含一个很好的例子:
admin.messaging().sendToDevice(tokens, payload).then((response) => {
// For each message check if there was an error.
const tokensToRemove = [];
response.results.forEach((result, index) => {
const error = result.error;
if (error) {
console.error('Failure sending notification to', tokens[index], error);
// Cleanup the tokens who are not registered anymore.
if (error.code === 'messaging/invalid-registration-token' ||
error.code === 'messaging/registration-token-not-registered') {
// TODO: remove the token from your registry/database
}
}
});
});
上面的代码使用了适用于 Node.js 的 Firebase Admin SDK,但同样的逻辑也可以应用于其他平台或通过 HTTPS 端点发送消息时。
推荐阅读
- java - 无法为属性驱动程序类名称设置值
- pandas - 迭代两个大型数据框以提取值的方式进行矢量化?
- python - 我试图在我的游戏中删除屏幕上的一个对象但“del ObjecName”不起作用
- javascript - 带有单选按钮的 JSON 到 Html 表
- scala - 将应用程序配置参数传递给 Spark 应用程序的问题
- qt - keyPressEvent 拒绝写入 QLineEdit
- applescript - 有没有一种有效的方法可以在一个代码中找到最大值、最小值、奇数和偶数?
- python - Matlab for循环,Python中的不同值
- java - 无法使用 Java Fx 排列和分隔我的代码?
- c# - 使用 List<> 对象嵌套元素格式返回 JSON 结果