【发布时间】:2018-11-25 22:24:36
【问题描述】:
我正在使用 Cloud Firestore 来保留应用令牌以发送推送通知。但是,当用户卸载并重新安装应用程序时,Firestore 会为同一用户收到不同的令牌。用户卸载应用时如何删除前一个token的相关行?
提前致谢。
【问题讨论】:
标签: android firebase firebase-cloud-messaging google-cloud-firestore
我正在使用 Cloud Firestore 来保留应用令牌以发送推送通知。但是,当用户卸载并重新安装应用程序时,Firestore 会为同一用户收到不同的令牌。用户卸载应用时如何删除前一个token的相关行?
提前致谢。
【问题讨论】:
标签: android firebase firebase-cloud-messaging google-cloud-firestore
通常您需要检测令牌何时失效,并在那时将其删除。例如。当令牌被循环时(在用户安装应用程序时每隔几周发生一次),您将希望利用该时刻从数据库中删除旧令牌并添加新令牌。这样做可以最大限度地减少数据库中过期令牌的数量。
所以在步骤中,这意味着onTokenRefresh():
检查本地存储中是否有令牌(例如共享首选项)。如果是这样,请从数据库和本地存储中删除该令牌。
将新令牌存储在数据库和本地存储中。
但在您的情况下这是不可能的,因为在卸载应用程序时不会调用 onTokenRefresh,并且在重新安装之前的令牌时您不会知道它。
处理以这种方式和其他方式留下的过时令牌的最简单方法是在发送到该令牌失败时删除它们。 sample of sending FCM notifications using Cloud Functions 就是一个很好的例子:
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') {
tokensSnapshot.ref.child(tokens[index]).remove();
}
}
});
});
【讨论】:
这很简单,当用户重新安装应用程序并再次登录时,只需用新令牌覆盖旧令牌即可。如果您还有其他需要在生成新令牌后删除的内容,只需检查现有令牌和新令牌即可。如果令牌不同,您可以删除所有不必要的东西。
【讨论】: