13

在官方文档和这个问题中,谷歌建议重新注册 GCM,因为注册 ID 可能会改变。

一种可能发生的假设方式是,在更新期间,全部卸载然后安装。如果在该间隙期间收到 GCM 通知,则NotRegistered可能会被退回,并且 GCM 注册 ID 可能会失效

如果 Google Play 自动更新我的应用程序,那么处理这种情况并重新注册的最可靠方法是什么?在像 WhatsApp 这样的应用程序中,除非收到 GCM 通知,否则用户可能永远不会明确启动任何活动。所以用户基本上是“迷路”,直到他不小心偶然发现了一个活动。

https://stackoverflow.com/a/14955308/111021中提到将包含“Canonical ID”,以便第 3 方服务器可以更新注册 ID。但是在文档中没有明确说明涵盖了这种情况(即 GCM 可能会在更新间隙期间将应用程序误认为“已卸载”,在这种情况下,在我看来,不会生成规范 ID,我会直接去NotRegistered)。

像 WhatsApp 或其他消息应用程序这样的“高可用性”应用程序如何处理这个问题?

4

3 回答 3

6

WhatsApp不是一个很好的例子。如果您检查 Android 设备上正在运行的服务列表,您会发现该WhatsApp服务始终在您的设备上运行。因此他们不依赖注册到 GCM 的应用程序(我不确定他们是否甚至使用 GCM)。

Google 建议在应用升级后重新注册的原因是为了克服可能导致应用在升级过程中被取消注册的错误。

注册 ID 更改的唯一已知原因是应用程序在升级时收到消息会自动取消注册的旧错误。在修复此错误之前,应用程序在升级后仍然需要调用 register(),并且到目前为止注册 ID 可能会在这种情况下发生变化。

(从这里引用)。

由于在您的应用程序再次启动之前您无法重新注册到 GCM,因此除了在应用程序的版本已更改时检查您的主要活动,然后重新注册到 GCM(如果有)之外,您没有什么比这更强大的了.

于 2014-05-21T16:32:22.473 回答
6

下面的解决方案怎么样:

为意图ACTION_PACKAGE_REPLACED创建一个BroadcastReceiver。当安装了新版本的软件包时,您将收到此意图。一旦你得到这个意图,你就可以重新注册到 GCM 以获得新的注册 ID。

广播操作:已安装应用程序包的新版本,替换之前安装的现有版本。数据包含包的名称。

于 2014-05-26T06:27:18.590 回答
3

知道您想在高可用性应用程序中使用 GCM 的原因会很有趣。尤其是请求的数量以及它们是否对时间敏感。

一般来说,根据我自己的经验,我可以推荐 GCM 远非高度可用。消息丢失或需要几分钟才能到达客户端。如果你真的想保证 100% 的消息传递,你应该在后台服务中使用 Sockets,并在每次连接丢失时重新建立连接。(顺便说一句:这是 WhatsApp 使用的方法)。

如果您想继续使用 GCM:可以考虑在 GCM 服务器回复 NotRegistered 时将您的消息重新安排在服务器上一分钟。

于 2014-05-26T13:25:37.640 回答