为什么gcm文档建议在应用程序更新时使注册无效



来自GCM文档:

更新应用程序时,应使其现有的无效注册ID,因为它不能保证与新版本一起使用。因为当应用程序更新后,实现此验证的最佳方法是存储存储注册ID时的当前应用程序版本。然后启动应用程序时,将存储的值与当前应用程序版本。如果不匹配,则使存储的数据并再次开始注册过程。

当文档声明"不能保证使用新版本"时,这是GCM的限制,还是他们在猜测我的应用程序在不同版本之间的行为可能会发生变化?

从应用程序方面,我可以或多或少地保证后续版本在GCM和我炮制的任何应用程序特定消息格式方面都能正常运行。我还需要重新注册吗?

如果是,我应该使用哪个来检测"新版本":版本代码还是版本名称?我的理解是,这些都是"自由形式",应用程序开发人员将它们设置为他选择的任何值。所以,如果我在商店里放了一个应用程序更新,但没有更改versionName或versionCode,该怎么办;我需要在GCM重新注册吗?

GCM实际上想要的似乎是应用程序在每次首次启动新安装时(以及每次连续启动直到注册完成)重新注册,而不管versionName和versionCode中的值如何。这是一个准确的说法吗?

我不记得我们在哪里读过,但我们注意到,当设备在未安装应用程序的情况下被推送时,谷歌将使注册id无效。

如果应用程序真的被卸载了,这是有道理的,但如果设备实际上处于更新的中间,它会很快卸载并重新安装,因此谷歌可能会错误地认为注册需要无效。

该解决方案似乎是在更新后首次启动时重新注册,以确保您的应用程序注册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.");
        }

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

最新更新