即使卸载后旧的 GCM 令牌仍然存在吗?

Posted

技术标签:

【中文标题】即使卸载后旧的 GCM 令牌仍然存在吗?【英文标题】:Do old GCM tokens live on even after an uninstall? 【发布时间】:2013-06-26 19:19:04 【问题描述】:

我们一直致力于 GCM 实施,并注意到分配给应用安装的设备地址即使卸载该应用也可以继续存在。

所以我们安装了一个应用程序,获取令牌 A,设备订阅了特定的警报类型 1,消息令牌 A 非常成功。然后我们卸载应用程序。

不,我们重新安装,接收令牌 B,并且设备订阅了特定的警报类型 2,我们向令牌 B 发送消息非常成功。

现在,由于我们在卸载和重新安装应用程序之间没有向令牌 A 发送消息,因此我们仍然可以向两个令牌发送消息,并且应用程序都会接收到它们。

如果我们在应用卸载时尝试向令牌 A 发送消息,我们可以从 Google 的响应中清除它。

有什么方法可以知道令牌 A 在技术上不再有效?

【问题讨论】:

【参考方案1】:

来自官方文档:

How uninstalled client app unregistration works

客户端应用在注册后可以自动注销 已卸载。但是,此过程不会立即发生。 什么 在这种情况下发生的是:

    最终用户卸载客户端应用程序。 应用服务器向 GCM 连接服务器发送消息。 GCM 连接服务器将消息发送到设备上的 GCM 客户端。 设备上的GCM客户端收到消息,检测到客户端应用已被卸载;检测详细信息取决于运行客户端应用程序的平台。 设备上的 GCM 客户端通知 GCM 连接 已卸载客户端应用程序的服务器。 GCM 连接服务器 将注册令牌标记为删除。 应用服务器发送一个 给 GCM 的消息。 GCM 将 NotRegistered 错误消息返回给 应用服务器。 应用服务器应该删除注册令牌。

注意 注册令牌可能需要一段时间才能完全完成 从 GCM 中删除。 因此,在步骤 7 中发送的消息可能 上面得到一个有效的消息 ID 作为响应,即使消息 不会传送到客户端应用程序。最终,注册 令牌将被删除,服务器将收到 NotRegistered 错误, 无需应用服务器执行任何进一步操作。

但是,正如用户在其他问题中所述,您显然仍会收到旧注册 ID 的通知:

App receives duplicate notification using GCM after reinstalling android GCM and multiple tokens https://***.com/questions/27845298/gcm-deleting-app-and-reinstalling-multiple-notifications Unregistering and re-registering for GCM messages causes two regId's to be valid. Is this as intended?

对于这个问题,有一个叫做“canonical IDs”的功能:

Canonical IDs

如果客户端应用程序中的错误触发多次注册 同一设备,很难协调状态和客户端应用程序 最终可能会收到重复的消息。

实施规范 ID 可以帮助您更轻松地从这些问题中恢复 情况。 规范的注册 ID 是 客户端应用程序请求的最后一次注册。这是身份证 服务器在向设备发送消息时应使用的。

如果您尝试使用旧的注册令牌发送消息,GCM 将 像往常一样处理请求,但它将包含规范 ID 响应的registration_id 字段。 确保更换 使用此规范 ID 存储在您的服务器中的注册令牌,如 最终旧的注册令牌将停止工作。

【讨论】:

有趣的是,我们在 GCM 认为处于活动状态但一年多没有任何用户活动的设备之间存在非常大的差异。此外,Google Play 仪表板中的活动设备数量明显低于接收 GCM 消息且未报告故障的设备数量。【参考方案2】:

我假设您实际上指的是注册 ID。旧的注册 ID 可以保持活跃一段时间。但是,Google 会告诉您,您需要通过 canonical ID 在对您发送的消息的响应中更新特定设备/应用组合的 regid。

【讨论】:

感谢@nickT,存储效果很好。 “GCM 提供了一种称为‘规范注册 ID’的工具,可以轻松地从这些情况中恢复。规范注册 ID 定义为您的应用程序请求的最后一次注册的 ID。这是服务器在向其发送消息时应使用的 ID设备。” 只是提一点;在 Google 的 gcm 服务器更新后,您将获得相同设备的相同注册 ID。

以上是关于即使卸载后旧的 GCM 令牌仍然存在吗?的主要内容,如果未能解决你的问题,请参考以下文章

将GCM令牌用于FCM中的推送消息

使用 GCM 重新安装应用程序后,获取旧设备令牌的推送通知成功

如果颁发了新的刷新令牌,旧的刷新令牌是不是仍然有效?

使所有 gcm 令牌无效

刷新后如何使以前的 JWT 令牌无效

GCM 3.0:新注册不会过期使用 GCMRegistrar 注册的令牌