在官方文档和this question中,Google建议重新注册GCM,因为注册ID可能会更改 .
如果Google Play自动更新我的应用,那么处理这种情况并重新注册的最强大的方法是什么?在像WhatsApp这样的应用中,除非收到GCM通知,否则用户可能永远不会明确启动任何活动 . 因此,用户基本上“迷失”,直到他意外地偶然发现了一项活动 .
在https://stackoverflow.com/a/14955308/111021中提到将包含"Canonical ID",以便第三方服务器可以更新注册ID . 但是在doc中没有明确说明这种情况被覆盖(即GCM可能会在更新间隙中误将应用程序视为"uninstalled",在这种情况下,在我看来,不会生成规范ID并且我会直接到 NotRegistered
) .
像WhatsApp或其他消息应用程序这样的“高可用性”应用程序如何处理这个问题?
3 回答
WhatsApp
不是一个好例子 . 如果您在Android设备上查看正在运行的服务列表,您会看到WhatsApp
始终在您的设备上保持服务正常运行 . 因此,他们不确定他们是否甚至使用GCM) .谷歌建议在升级应用程序后重新注册的原因是克服可能导致应用程序在升级过程中取消注册的错误 .
(引自here) .
由于在您的应用程序再次启动之前无法重新注册到GCM,除了在应用程序版本发生更改时检入主活动,然后重新注册到GCM(如果有) .
以下解决方案如何:
为intent ACTION_PACKAGE_REPLACED 创建 BroadcastReceiver . 安装新版本的软件包时,您将收到此意图 . 获得此意图后,您可以重新注册GCM以获取新的注册ID .
Broadcast Action: 已安装新版本的应用程序包,替换以前安装的现有版本 . 数据包含包的名称 .
了解您希望在高可用性应用中使用GCM的原因会很有趣 . 特别是请求的数量以及它们是否对时间敏感 .
总的来说,根据我自己的经验,我可以推荐,GCM远非高度可用 . 消息丢失或需要几分钟才能到达客户端 . 如果您确实希望保证100%的邮件传递,则应在后台服务中使用套接字,并在每次丢失时重新 Build 连接 . (顺便说一下:这是WhatsApp使用的方法) .
如果您想继续使用GCM:当GCM服务器回复NotRegistered时,可能会考虑在服务器上重新安排您的消息一分钟 .