如何识别和删除服务器上过期的 FCM 令牌?

Posted

技术标签:

【中文标题】如何识别和删除服务器上过期的 FCM 令牌?【英文标题】:How do I identify and delete the expired FCM token on server? 【发布时间】:2019-09-09 09:19:23 【问题描述】:

我正在考虑用户在多个设备上安装应用程序的场景,比如移动设备和桌面设备;并生成两个不同的令牌。

我目前的计划是将用户的两个令牌都存储在数据库中。但是,我不确定令牌过期并生成新令牌时如何处理这种情况?

例如,这可能是简单的 db 结构 -

id | user_id | token
-------------------------
1  | 1 | asdlgkj090sdf8q (desktop)
2  | 1 | zlkroqiuoiquoio (mobile)
3  | 2 | mnnjnjnjnjojuhq
4  | 2 | 498slkdsflksjfl

如果移动令牌得到更新;我不知道要更新哪一行。

我该如何处理这种情况?

【问题讨论】:

【参考方案1】:

如果您想在生成新令牌后删除旧令牌,我可以想到两种方法:

选项 1:引入客户 ID

您可以为每个客户提供一个唯一的 ID,用于识别它。当您将新的推送令牌发送到服务器时,您需要确保您还将客户端 ID 传递给服务器。您的数据库结构将如下所示:

id | user_id | client_id | token
------------------------------------------------------ 
1  | 1       | tthdh     | asdlgkj090sdf8q (desktop) 
2  | 1       | di4dq     | zlkroqiuoiquoio (mobile) 
3  | 2       | 5efgd     | mnnjnjnjnjojuhq 
4  | 2       | 56eff     | 498slkdsflksjfl

在您的更新脚本(在服务器上)中,您将检查给定客户端 ID 是否存在推送令牌,然后替换旧的或插入新行。

选项 2:记住旧令牌

第二个选项是将当前令牌存储在客户端上,如果更新了,则将旧令牌和新令牌都发送到服务器。然后搜索旧令牌并替换它(如果旧令牌不存在,则插入新行)。

如果您想查明给定令牌是否已过期,请查看this answer。我在 Firebase 文档中看到的另一种方法是在发送消息失败时删除用于发送推送消息的令牌。

【讨论】:

【参考方案2】:

最好的方法是谷歌server-integration文档中描述的方法:

当通过管理 SDK 发送消息时,无效/过期令牌将 引发错误,然后您可以将它们从数据库中删除。

因此,当您发送消息时,如果可以在 table 9 here 中找到 error,则 API 会返回包含结果状态和可能值的响应:

如果响应状态为200 + 和error -> NotRegistered >> 表示令牌已过期,因此请从您的数据库中删除此令牌。

【讨论】:

以上是关于如何识别和删除服务器上过期的 FCM 令牌?的主要内容,如果未能解决你的问题,请参考以下文章

如何识别 OAuth 令牌是不是已过期?

使用 FCM Android 推送通知并删除令牌

FCM 保持令牌同步

突然 fcm 通知在某些 iOS 设备上不起作用

如何获得 FCM 代币?

如何使 fcm 推送通知过期或设置生命周期?