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

Android 应用程序在重新安装后使用GCM收到重复通知,android,google-cloud-messaging,Android,Google Cloud Messaging,我目前正在尝试使用GCM向用户发送通知,目前我仍在研究如何最大限度地利用它。现在,我只使用文档中提供的示例项目,并使用gcm客户机示例进行处理 现在,我尝试使用应用程序创建的注册ID来推送消息,是的,它成功地传递了消息 现在的问题是,在我卸载应用程序之后。重新安装后,它将生成一个新的注册ID,其中我将其与上一个注册ID一起存储在服务器上,但我不能标记上一个注册ID以不接收任何进一步的消息,因为当用户没有internet连接时,可能会发生卸载。之后,我向两个注册ID发送一条消息,这是卸载应用程序之

我目前正在尝试使用GCM向用户发送通知,目前我仍在研究如何最大限度地利用它。现在,我只使用文档中提供的示例项目,并使用gcm客户机示例进行处理

现在,我尝试使用应用程序创建的注册ID来推送消息,是的,它成功地传递了消息

现在的问题是,在我卸载应用程序之后。重新安装后,它将生成一个新的注册ID,其中我将其与上一个注册ID一起存储在服务器上,但我不能标记上一个注册ID以不接收任何进一步的消息,因为当用户没有internet连接时,可能会发生卸载。之后,我向两个注册ID发送一条消息,这是卸载应用程序之前的ID和重新安装应用程序之后的ID。结果是,我收到了两条推送消息,尽管我希望它只收到一条,因为应用程序已经更改了注册ID

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


我能做些什么来处理这些重复消息?

重新安装后,您将得到新的RegId和prev不再有效。所以,即使您向两个regid发送push,也只有last会收到它

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

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


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

@KaHel当卸载客户端应用程序时,RegId将在一段时间内有效,您是对的。但是,当客户端应用程序将再次安装,并且推送服务器尝试使用旧注册id发送消息时,该消息将成功发送,但GCM服务器会将cannonical_id设置为作为响应。你应该用cannonical_id来纠正这个反应。我是怎么描述的,没有什么大问题。即,一旦您从GCM服务器获得cannonical_id,您应立即用新的值替换旧的注册id。它将允许您不为一个客户生成多个Regid,而只是一对一。

来自官方文档:

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

  • 最终用户卸载客户端应用程序
  • 应用服务器向GCM连接服务器发送消息
  • GCM连接服务器将消息发送到设备上的GCM客户端
  • 设备上的GCM客户端收到消息,检测到客户端app已卸载;检测详细信息取决于运行客户端应用程序的平台
  • 设备上的GCM客户端通知GCM连接 已卸载客户端应用的服务器
  • GCM连接服务器 将注册令牌标记为删除
  • 应用服务器发送一个 给GCM的消息
  • GCM将一条NotRegistered错误消息返回给 应用服务器
  • 应用服务器应删除注册令牌 注 注册令牌可能需要一段时间才能完全注册 从GCM中删除因此,在步骤7中发送的消息可能 上面获取一个有效的消息ID作为响应,即使消息 不会发送到客户端应用程序。最终,注册 令牌将被删除,服务器将收到NotRegistered错误, 无需应用服务器执行任何进一步操作

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

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

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

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

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


    问题是,正如我在问题中提到的,以前的注册id仍然收到通知。我还以为它是无效的,不会再收到消息,但它仍然收到推送消息。好吧,我想我明白了。无论如何,应用程序应该对所有人开放。这意味着推送通知的设置为公用。如果我使用GoogleIDI,当用户更改登录名并生成两个id时,我可能仍然会遇到同样的问题。感谢您提供的信息。我会试着看一下我的日志。