应用程序在重新安装后使用GCM收到重复通知

时间:2014-12-05 11:42:42

标签: android google-cloud-messaging

我目前正在尝试使用GCM向用户发送通知,目前我还在研究如何最大化它。现在我只使用文档here上提供的示例项目,并使用gcm-client示例来处理它。

现在使用此project from Git我尝试使用应用创建的注册ID来推送消息,是的,它成功传递了消息。

现在的问题是我卸载了应用程序之后。重新安装后,它将生成一个新的注册ID,其中我将它与前一个一起存储在服务器上,但我无法将之前的注册ID标记为不接收任何进一步的消息,因为当用户没有互联网时可能会发生卸载连接。之后,我发送消息到两个注册ID,这是卸载应用程序之前的ID和重新安装应用程序后的ID。发生了什么事情,我收到了两个推送消息,尽管我预计它只会获得一个,因为应用程序已经更改了注册ID。

我希望该应用可能会收到两个或更多重复的应用,如果我还更新了应用,因为正如文档中所述,注册ID可能会在更新时更改。

我可以采取哪些解决方法来处理这些重复的消息?

3 个答案:

答案 0 :(得分:3)

来自官方文件:

  

<强> How uninstalled client app unregistration works

     

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

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

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

但是,显然您可能会收到旧注册ID的通知,因为用户在其他问题中说明了这一点:

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

  

<强> Canonical IDs

     

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

     

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

     

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

答案 1 :(得分:2)

@KaHel当卸载客户端应用程序时,regId将在一段时间内有效,您是对的。但是,当客户端应用程序再次安装并且您的推送服务器尝试在旧注册表上发送消息时,该消息将成功发送,但GCM服务器将 cannonical_id 作为响应。你应该用cannonical_id来纠正这个响应的过程。我如何描述at this post并且没有大documentation about cannonical_id。即一旦从GCM服务器获得cannonical_id,您应立即用新的值替换旧的reg_id。它将允许您不为一个客户端生成多个regIds,只需一对一。

答案 2 :(得分:0)

重新安装后,您将获得新的RegId并且不再有效。因此,即使您向两个RegIds发送推送,也只有最后一个会收到它。

您可以在应用程序中实现帐户的逻辑。

例如,当用户在应用程序中登录时,您发送他的GoogleId + RegId。重新安装应用程序并重新登录后,您只需更新服务器上的RegId。因此,每个用户只能拥有一个RegId。

存在问题:只有一个设备会收到推送消息(如果您使用相同的帐户登录2个设备)。因此,您可以在启动应用程序后发送到服务器GoogleId + RegId + DeviceId。