即使卸载应用,旧的GCM令牌是否仍然存在?

18
我们正在开发一个GCM实现,并注意到向应用程序安装分配的设备地址即使在卸载应用后也能保留。
所以我们安装一个应用程序,获得标记A,设备订阅特定警报类型1,使用标记A发送消息非常成功。然后我们卸载应用程序。
现在我们重新安装,接收标记B,设备订阅特定警报类型2,我们使用标记B成功地发送消息。
由于我们在应用程序被卸载和重新安装之间没有向标记A发送消息,因此我们仍然可以向两个标记发送消息,并且应用程序都会收到它们。
如果我们尝试在应用程序被卸载时向标记A发送消息,我们可以从Google的响应中清除它。
有没有办法知道标记A技术上不再有效?
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替换存储在您服务器上的注册令牌,因为旧的注册令牌最终将停止工作。


1
有趣的是,我们发现在GCM中被认为是活跃设备的数量与实际上一年内没有任何用户活动的设备数量之间存在很大的差异。此外,在Google Play仪表板中活跃设备的数量明显低于接收到GCM消息且未报告任何故障的设备数量。 - silentser

6

我假设你所谓的“token”实际上是指注册ID。旧的注册ID可能会保持活动状态一段时间。但是,谷歌会通过响应您发送的消息中的规范化ID告诉您需要更新特定设备/应用程序组合的regid。


谢谢@nickT,存储那个完美地运作了。"GCM提供了一个名为'规范注册ID'的功能,可以轻松从这些情况中恢复。规范注册ID被定义为您的应用程序最后一次请求的注册ID。这是服务器在向设备发送消息时应该使用的ID。" - Matt Restivo
只是提一下,经过Google的GCM服务器更新后,同一设备将获得相同的注册ID。 - EvanBlack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接