18

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

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

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

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

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

有没有办法知道令牌 A 在技术上不再有效?

4

2 回答 2

13

来自官方文档:

卸载的客户端应用程序注销的工作原理

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

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

请注意,从 GCM 中完全删除注册令牌可能需要一段时间。因此,在上述第 7 步期间发送的消息可能会获得有效的消息 ID 作为响应,即使该消息不会传递到客户端应用程序也是如此。最终,注册令牌将被删除,服务器将收到 NotRegistered 错误,而无需应用服务器采取任何进一步的操作。

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

对于这个问题,有一个称为“规范 ID”的功能:

规范 ID

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

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

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

于 2015-08-05T09:21:58.613 回答
6

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

于 2013-06-26T19:41:05.623 回答