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

Posted

技术标签:

【中文标题】应用程序在重新安装后使用 GCM 收到重复通知 [重复]【英文标题】:App receives duplicate notification using GCM after reinstalling [duplicate] 【发布时间】:2014-12-05 11:42:42 【问题描述】:

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

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

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

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

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

【问题讨论】:

【参考方案1】:

来自官方文档:

How uninstalled client app unregistration works

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

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

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

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

android GCM and multiple tokens Unregistering and re-registering for GCM messages causes two regId's to be valid. Is this as intended? Do old GCM tokens live on even after an uninstall?

对于这个问题,有一个叫做“canonical IDs”的功能:

Canonical IDs

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

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

感谢您的信息。我会尝试阅读我的日志。【参考方案3】:

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

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

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

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

【讨论】:

问题是以前的 reg id 仍然收到我在问题中提到的通知。我还预计它无效并且不会再收到消息,但它仍然收到推送消息。 好的,我想我明白了。无论如何,该应用程序应该对所有人开放。这意味着推送通知的设置是为公众使用而设置的。如果我使用 google id,当用户更改登录名并生成两个 ID 时,我可能仍然会遇到同样的问题。

以上是关于应用程序在重新安装后使用 GCM 收到重复通知 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用 GCM 重新安装应用程序后,获取旧设备令牌的推送通知成功

如果我强制停止应用程序,GCM 会收到推送通知

Android GCM:通知关闭后重复推送

为啥 GCM 推送通知会重复?

在某些设备上下班后收到 Gcm 通知

在 GCM 中未收到推送通知