为什么gcm docs建议在应用更新时无效注册?

jph*_*jph 10 android google-cloud-messaging

来自GCM 文档:

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

当文档声明"它不能保证与新版本一起使用"是GCM的限制,还是他们推测我的应用程序从版本到版本的行为可能发生的变化?

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

如果是这样,我应该使用哪个来检测"新版本":版本代码或版本名称?我的理解是这些是"自由形式",应用程序开发人员将它们设置为他选择的任何值.那么,如果我在商店中添加应用更新但不更改versionName或versionCode,该怎么办?我需要重新注册GCM吗?

看起来GCM 实际想要的是每次第一次启动新安装时(以及每次连续启动直到注册完成),应用程序重新注册,无论versionName和versionCode中的值如何.这是一个准确的陈述吗?

mar*_*mor 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.");
        }
Run Code Online (Sandbox Code Playgroud)