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

The*_*igK 8 firebase-cloud-messaging

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

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

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

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

Run Code Online (Sandbox Code Playgroud)

如果移动令牌更新;我无法知道要更新哪一行。

我如何处理这种情况?

Mar*_*uin 9

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

选项 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
Run Code Online (Sandbox Code Playgroud)

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

选项 2:记住旧令牌

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

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


Ana*_*afi 4

最好的方法是谷歌服务器集成文档中描述的方法:

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

因此,当您发送消息时,响应将从 API 返回,其中包含结果状态以及可能的值(如果error可以在此处的表 9中找到):

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