FCM 注册令牌管理的最佳做法

如果您使用 FCM API 以编程方式构建发送请求,那么随着时间的推移可能会发现,使用过时的注册令牌向不活跃的设备发送消息是在浪费资源。这种情况可能会影响 Firebase 控制台中报告的消息传送数据或导出到 BigQuery 的数据,表现为传送速率明显(但并非真正有效)下降。本指南介绍了一些您可以采取的措施,以帮助确保实现高效的消息定位和有效的传送报告。

基本最佳做法

在使用 FCM API 以编程方式构建发送请求的任何应用中,您都应该遵循一些基本做法。主要的最佳实践包括:

  • 将注册令牌存储在服务器上。服务器的一个重要作用是跟踪每个客户端的令牌,并保留一份不断更新的活跃令牌更新。我们强烈建议您在代码和服务器中实现令牌时间戳,并定期更新此时间戳。
  • 移除存储的过时令牌。除了在出现明显无效的令牌响应时移除令牌,您可能还需要监控其他表明令牌过时的信号。本指南将介绍一些旨在实现这一目标的方法。

检索和存储注册令牌

初次启动您的应用时,FCM SDK 会为客户端应用实例生成一个注册令牌。您必须将该令牌包含在从 API 发出的设置了定位目标的发送请求中,或添加到主题订阅中以便定位主题。

正如我们的客户端设置指南中所述,您的应用应在初始启动时检索此令牌,并将其与时间戳一起保存到应用服务器。 此时间戳必须通过您的代码和服务器实现,因为 FCM SDK 并不会向您提供它。

此外,请务必将令牌保存到服务器并在每次更改时更新时间戳,例如,在这些情况下:

  • 应用在新设备上恢复
  • 用户卸载/重新安装应用
  • 用户清除应用数据

检测来自 FCM 后端的无效令牌响应

请务必检测来自 FCM 的无效令牌响应,并采取处理措施:从您的系统中删除任何已知无效的注册令牌。对于 HTTP v1 API,这些错误消息可能表明您的发送请求是以过时或无效的令牌为目标的:

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

如需了解详情,请参阅错误代码

如果您收到目标令牌的任何上述响应,可以放心地删除此令牌的记录,因为它将永远无效。但请注意,仍将存在令牌确实无效但不会显示任何指示的情形。例如,有时 FCM 后端无法验证设备是否已永久离线。

确保注册令牌保持最新状态

有时您并不能够简单直接地确定令牌是最新的还是过时的。如需涵盖所有情况,应该采用阈值来确定何时将令牌视为过时;我们建议您设为两个月。任何超过两个月的令牌都可能是不活跃的设备;活跃设备会更新其令牌。

定期更新令牌

我们建议您定期检索和更新服务器上的所有注册令牌。这要求您执行以下操作:

  • 在客户端应用中添加应用逻辑,以使用适当的 API 调用(例如,对于 Apple 平台,token(completion):;对于 Android,getToken())检索当前令牌,然后将当前令牌发送至应用服务器进行存储(带有时间戳)。这可能是每月都要执行的作业,配置目的是涵盖所有客户端/令牌。
  • 添加服务器逻辑以定期更新令牌的时间戳,无论令牌是否已更改。

无论您遵循哪种计时模式,都请务必定期更新令牌。采用每月一次的更新频率应该能够在电池影响与检测不活跃注册令牌之间达到很好的平衡。通过执行这种更新,还可以确保任何进入不活跃状态的设备在重新进入活跃状态时更新其注册状态。将更新频率设置为短于每周一次不会带来任何好处。

退订主题的过时令牌

此外还存在另一个注意事项,即管理主题订阅以移除过时的注册令牌。这涉及两个步骤:

  1. 您的应用应在每月和/或在注册令牌发生更改时重新订阅一次主题。这样可以形成一个自我修复的解决方案,每当应用重新进入活跃状态时,即可自动进行订阅。
  2. 如果应用实例空闲 2 个月(或您自己设置的过时窗口),您应该使用 Firebase Admin SDK 将其退订主题,以便从 FCM 后端删除令牌/主题映射。

这两个步骤的好处在于,扇出速度更快,因为要扇出的过时令牌较少,并且过时的应用实例会在重新进入活跃状态之后自动重新订阅。

衡量传送是否成功

通常,我们建议根据从活跃的应用实例观察或捕获的操作来定位消息。如果您定期向拥有大量订阅者的主题发送消息,这一点尤为重要;如果其中部分订阅者实际上处于不活跃状态,那么随着时间的推移,对传送统计信息产生的影响将非常显著。

在将消息定位到令牌之前,请考虑:

  • Google Analytics(分析)、在 BigQuery 中捕获的数据或其他跟踪信号是否表示令牌有效?
  • 之前的传送尝试是否在一段时间内总是失败?
  • 在过去的两个月中,您的服务器上的注册令牌是否已更新?
  • 对于 Android 设备,FCM Data API 是否报告了较高的因 droppedDeviceInactive 而导致消息传送失败的百分比?

如需详细了解传送,请参阅了解消息传送