什么将 Firebase Cloud Messaging 令牌标记为不活动?

问题描述 投票:0回答:1

我无法在文档或 Firebase 中找到正确的信息。

当陈旧代币达到 270 天不活动状态时,FCM 将认为它们是过期代币

不活动的定义是什么?

如果应用程序调用 getToken(),这会将计数器重置为 0 天吗?

如果应用程序 200 天没有调用 getToken() 并收到推送通知,这会将计数器重置为 0 天吗?

我需要这些信息才能知道何时更新后端的时间戳。

测试非常困难,因为你无法真正知道令牌的真正到期日期,而且你不能等待 270 天才能弄清楚。

firebase react-native push-notification firebase-cloud-messaging react-native-fcm
1个回答
0
投票

您可以(实际上应该)依赖 FCM API 响应来检测过期和无效的令牌,而不是主动尝试从数据库中删除令牌。来自检测无效令牌的文档:

检测来自 FCM 后端的无效令牌响应
确保检测到来自 FCM 的无效令牌响应,并通过从系统中删除任何已知无效或已过期的注册令牌来进行响应。使用 HTTP v1 API,这些错误消息可能表明您的发送请求针对无效或过期的令牌:

  • UNREGISTERED
    (HTTP 404)
  • INVALID_ARGUMENT
    (HTTP 400)

注意:如果消息有效负载出现问题,也可以返回 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 会认为令牌已过时。任何超过一个月的令牌都可能是不活动的设备;否则,活动设备会刷新其令牌。

根据您的使用案例,一个月可能太短或太长,因此由您决定适合您的标准。

因此,如果您还实现了此令牌清理,则应删除任何超过一个月的令牌,因为届时活动客户端将刷新其令牌。

© www.soinside.com 2019 - 2024. All rights reserved.