为什么GCM文档建议在应用程序更新时使注册失效?

11

根据GCM 文档:

应用程序升级后,应使其现有的注册 ID 失效,因为不能保证它能与新版本一起使用。由于在应用程序更新时没有调用生命周期方法,因此实现此验证的最佳方法是在存储注册 ID 时存储当前应用程序版本。然后,在启动应用程序时将存储的值与当前应用程序版本进行比较。如果它们不匹配,则使存储的数据无效并重新开始注册过程。

当文档中提到“不能保证它能与新版本一起使用”时,这是 GCM 的限制还是他们在推测版本之间我的应用程序行为的潜在变化?

从应用程序方面来看,我可以大致保证连续版本会正确地运行,并且与 GCM 和任何我编写的应用程序特定的消息格式相关。我是否仍需要重新注册?

如果需要重新注册,应该使用哪个来检测“新版本”:versionCode 还是 versionName? 我的理解是,这些都是“自由格式”,应用程序开发人员可以将它们设置为任何值。那么,如果我将一个应用程序更新放到商店中,但不更改 versionName 或 versionCode,那么我需要重新向 GCM 注册吗?

看起来 GCM 实际上想要的是每次首次启动新安装时,应用程序都需要重新注册(直到注册完成),而不管 versionName 和 versionCode 的值是什么。这句话准确吗?

2个回答

13

我不记得我们在哪里读到过这个信息,但是我们注意到当设备在没有安装应用程序的情况下收到推送时,Google会使注册ID失效。

如果应用程序确实被卸载了,这是有道理的,但如果设备实际上在更新的过程中,它会快速地卸载和重新安装,因此Google可能会错误地认为需要使注册失效。

解决方案似乎是在更新后的第一次启动时重新注册,以确保您的应用程序注册ID处于活动状态。

版本代码确实是一个自由选择的数字,但是您必须在每次向Google Play发布新版本时增加它,这样您就可以检查该数字是否已更改,并知道您的应用程序已被更新并且需要刷新注册。

编辑:

这也与C2DM的继任者GCM相关,有更多文档解释了这种行为以及如何正确编写代码。

请参见:http://developer.android.com/google/gcm/client.html,了解所有细节。

具体来说,这段代码中的getRegistrationId如果版本代码发生更改,将返回一个空字符串,强制客户端重新注册:

        if (checkPlayServices()) {
            gcm = GoogleCloudMessaging.getInstance(this);
            regid = getRegistrationId(context);

            if (regid.isEmpty()) {
                registerInBackground();
            }
        } else {
            Log.i(TAG, "No valid Google Play Services APK found.");
        }

1
感谢提供这个好信息。当检测到“首次启动”场景时,是否只要简单地再次调用GCMRegistrar.register()就足够了,还是应该尝试显式取消注册?我猜测应该是前者,但我想问问。 - jph
1
只需重新调用register即可,但不要忘记将新的注册ID传递给您的服务器。 - marmor
我尝试测试了您的提示,但是没有看到任何变化。在我安装新版本并注册新ID后,注册ID并没有改变。 - Leo Nguyen
1
@LeoNguyen,他们并没有说每次更新都必须更改注册ID,只是说不能保证更新后它仍然相同,这意味着为了安全起见,您需要重新注册。 - marmor

0

我会使用版本代码来检测应用程序更新。每次提交新版本到Google Play商店时,版本代码都会被强制更改,因此您可以依靠它来检测应用程序的版本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接