我无法在文档或 Firebase 中找到正确的信息。
当陈旧代币达到 270 天不活动状态时,FCM 将认为它们是过期代币
不活动的定义是什么?
如果应用程序调用 getToken(),这会将计数器重置为 0 天吗?
如果应用程序 200 天没有调用 getToken() 并收到推送通知,这会将计数器重置为 0 天吗?
我需要这些信息才能知道何时更新后端的时间戳。
测试非常困难,因为你无法真正知道令牌的真正到期日期,而且你不能等待 270 天才能弄清楚。
您可以(实际上应该)依赖 FCM API 响应来检测过期和无效的令牌,而不是主动尝试从数据库中删除令牌。来自检测无效令牌的文档:
检测来自 FCM 后端的无效令牌响应
确保检测到来自 FCM 的无效令牌响应,并通过从系统中删除任何已知无效或已过期的注册令牌来进行响应。使用 HTTP v1 API,这些错误消息可能表明您的发送请求针对无效或过期的令牌:
(HTTP 404)UNREGISTERED
(HTTP 400)INVALID_ARGUMENT
注意:如果消息有效负载出现问题,也可以返回 INVALID_ARGUMENT1,因此仅当有效负载完全有效时,它才会发出无效令牌的信号。请参阅错误代码了解更多信息。
如果您确定消息有效负载有效并且收到目标令牌的这些响应之一,则可以安全地删除此令牌的记录,因为它永远不会再有效。例如,要从 Cloud Firestore 删除无效令牌,您可以部署并运行如下所示的函数:
// Registration token comes from the client FCM SDKs const registrationToken = 'YOUR_REGISTRATION_TOKEN'; const message = { data: { // Information you want to send inside of notification }, token: registrationToken }; // Send message to device with provided registration token getMessaging().send(message) .then((response) => { // Response is a message ID string. }) .catch((error) => { // Delete token for user if error code is UNREGISTERED or INVALID_ARGUMENT. if (errorCode == "messaging/registration-token-not-registered") { // If you're running your own server, call API to delete the token for the user // Example shown below with Firestore // Get user ID from Firebase Auth or your own server Firebase.firestore.collection("fcmTokens").document(user.uid).delete() } });
仅当令牌在 270 天后过期或客户端明确取消注册时,FCM 才会返回无效令牌响应。如果您需要根据自己的定义更准确地跟踪过时情况,您可以主动删除过时的注册令牌。
最后一个链接似乎是您想要做的,因此(强调我的):
保持代币新鲜度并删除陈旧代币
确定令牌是新鲜还是陈旧并不总是那么简单。为了涵盖所有情况,您应该在认为令牌过时时采用一个阈值。默认情况下,如果应用程序实例一个月没有连接,FCM 会认为令牌已过时。任何超过一个月的令牌都可能是不活动的设备;否则,活动设备会刷新其令牌。根据您的使用案例,一个月可能太短或太长,因此由您决定适合您的标准。
因此,如果您还实现了此令牌清理,则应删除任何超过一个月的令牌,因为届时活动客户端将刷新其令牌。