Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

FCM 注册令牌管理的最佳实践

如果您使用 FCM API 以编程方式构建发送请求,您可能会发现,随着时间的推移,您将消息发送到具有陈旧注册令牌的非活动设备,从而浪费资源。这种情况可能会影响 Firebase 控制台中报告的消息传递数据或导出到 BigQuery 的数据,表现为传递率急剧下降(但实际上并不有效)。本指南讨论了您可以采取的一些措施,以帮助确保有效的邮件定位和有效的传递报告。

基本最佳实践

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

  • 在您的服务器上存储注册令牌。服务器的一个重要角色是跟踪每个客户端的令牌并保持活动令牌的更新列表。我们强烈建议在您的代码和服务器中实施令牌时间戳,并定期更新此时间戳。
  • 删除存储令牌变得陈旧。除了在明显的无效令牌响应情况下删除令牌之外,您可能还需要监视令牌陈旧的其他迹象。本指南讨论了实现这一目标的一些选项。

检索和存储注册令牌

在您的应用程序初始启动时,FCM SDK 会为客户端应用程序实例生成一个注册令牌。这是您必须包含在来自 API 的定向发送请求中的令牌,或者添加到用于定向主题的主题订阅。

正如我们在客户端安装指南指出,您的应用程序应该在检索初始启动此令牌,并将其保存到你的应用服务器旁边一个时间戳。此时间戳必须由您的代码和服务器实现,因为 FCM SDK 不为您提供。

此外,将令牌保存到服务器并在其更改时更新时间戳也很重要,例如:

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

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

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

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

ErrorCode的更多信息。

如果您收到针对目标令牌的这些响应中的任何一个,则可以安全地删除此令牌的记录,因为它将不再有效。但是,请记住,仍然会有令牌实际上无效的情况,但没有任何迹象。例如,有时 FCM 后端无法验证设备是否已永久离线。

确保注册令牌的新鲜度

确定令牌是新鲜的还是陈旧的并不总是那么简单。为了涵盖所有情况,您应该在考虑令牌陈旧时采用阈值;我们的建议是两个月。任何超过两个月的令牌都可能是非活动设备;否则,活动设备会刷新其令牌。

定期更新令牌

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

  • 添加应用程序逻辑在您的客户端应用程序,以获取令牌使用适当的API调用的电流(如token(completion):用于iOS或getToken()用于Android系统),然后发送当前令牌你的应用服务器进行存储(带时间戳) .这可以是配置为涵盖所有客户端/令牌的月度作业。
  • 添加服务器逻辑以定期更新令牌的时间戳,无论令牌是否已更改。

无论您遵循什么计时模式,请确保定期更新令牌。每月一次的更新频率可能会在电池影响与检测非活动注册令牌之间取得良好的平衡。通过执行此刷新,您还可以确保任何处于非活动状态的设备在再次变为活动状态时都会刷新其注册。比每周更频繁地进行刷新没有任何好处。

从主题中取消订阅过时的令牌

管理主题订阅以删除陈旧的注册令牌是另一个考虑因素。它包括两个步骤:

  1. 您的应用应每月和/或每当注册令牌发生变化时重新订阅主题。这形成了一个自我修复的解决方案,当应用程序再次激活时,订阅会自动重新出现。
  2. 如果一个应用程序实例是闲置2个月(或者你自己过时的窗口),你应该使用的主题取消其火力地堡管理员SDK中删除从FCM后端令牌/主题映射。

这两个步骤的好处是您的扇出将发生得更快,因为要扇出的陈旧令牌较少,并且陈旧的应用程序实例将在它们再次激活后自动重新订阅。

衡量交付成功

通常,我们建议根据从活跃使用的应用程序实例中观察到或捕获的操作来定位消息。如果您定期向拥有大量订阅者的主题发送消息,这一点尤其重要;如果这些订阅者中有一部分实际上处于非活动状态,那么随着时间的推移,对您的交付统计数据的影响可能会很大。

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

  • Google Analytics、BigQuery 中捕获的数据或其他跟踪信号是否表明令牌处于活动状态?
  • 之前的交付尝试是否在一段时间内一直失败?
  • 在过去的两个月内,您的服务器上的注册令牌是否更新过?
  • 对于Android设备,并在FCM数据API报告的消息传递失败的高百分比由于droppedDeviceInactive

有关传递更多信息,请参阅了解消息传递