我们一直致力于GCM实施,并注意到即使卸载了应用,分配给应用安装的设备地址也可以继续使用。
因此,我们安装了一个应用程序,获得了令牌A,设备订阅了特定的警报类型1,消息令牌A非常成功。然后我们卸载应用程序。
不,我们重新安装,接收令牌B,并且设备订阅了特定的警报类型2,我们给令牌B留言非常成功。
既然我们在卸载和重新安装应用程序之间没有向令牌A发送消息,我们仍然可以向两个令牌发送消息,并且应用程序会同时收到这两个令牌。
如果我们在卸载应用时试图向令牌A发送消息,我们可以从Google的回复中清除它。
有没有办法知道令牌A在技术上不再有效?
答案 0 :(得分:12)
来自官方文件:
<强> How uninstalled client app unregistration works 强>
客户端应用可以自动取消注册 卸载。但是,这个过程不会立即发生。什么 在这种情况下发生的是:
- 最终用户卸载客户端应用。
- 应用服务器向GCM连接服务器发送消息。
- GCM连接服务器将消息发送到设备上的GCM客户端。
- 设备上的GCM客户端收到消息并检测到客户端应用程序已卸载;检测详细信息取决于运行客户端应用程序的平台。
- 设备上的GCM客户端通知GCM连接 卸载客户端应用程序的服务器。
- GCM连接服务器 标记要删除的注册令牌。
- 应用服务器发送一个 给GCM的消息。
- GCM将NotRegistered错误消息返回给 应用服务器。
- 应用服务器应删除注册令牌。
醇>请注意 注册令牌可能需要一段时间才能完全实现 从GCM中删除。 因此,有可能在步骤7中发送消息 以上获取有效的消息ID作为响应,即使消息 将不会发送到客户端应用程序。最终,注册 令牌将被删除,服务器将收到NotRegistered错误, 无需从应用服务器进行任何进一步操作。
但是,显然您可能会收到旧注册ID的通知,因为用户在其他问题中说明了这一点:
对于此问题,有一个名为“规范ID”的功能:
<强> Canonical IDs 强>
如果客户端应用中的错误触发了多个注册 相同的设备,可能很难协调状态和客户端应用程序 可能最终会出现重复的消息。
实施规范ID可以帮助您更轻松地从中恢复 的情况。 规范注册ID是注册令牌 客户端应用程序请求的最后一次注册。这是ID 服务器在向设备发送消息时应使用
如果您尝试使用旧的注册令牌发送消息,GCM将会 像往常一样处理请求,但它将包括规范ID 响应的registration_id字段。 确保更换 使用此规范ID存储在服务器中的注册令牌,如 最终旧的注册令牌将停止工作。
答案 1 :(得分:6)
我假设你通过“令牌”实际上是指注册ID。旧注册ID可以暂时保持活动状态。但Google会告诉您,您需要通过对已发送邮件的回复中的canonical ID更新特定设备/应用组合的注册表。