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

时间:2012-07-10 22:11:35

标签: android google-cloud-messaging

来自GCM docs

  

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

如果文档声明“无法保证使用新版本”是GCM限制,还是他们推测应用从版本到版本的行为可能会发生变化?

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

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

似乎GCM 实际上想要的是,每次首次启动新安装时(每次连续启动直到注册完成),应用程序都会重新注册,无论如何versionName和versionCode中的值。这是一个准确的陈述吗?

2 个答案:

答案 0 :(得分:13)

我不记得我们在哪里读过它,但我们注意到,当设备在未安装应用时进行推送时,Google会使注册ID无效。

如果应用程序确实已卸载,这是有道理的,但如果设备实际上处于更新的中间位置,则会快速卸载并重新安装,因此Google可能会错误地认为注册需要失效。

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

版本代码确实是一个自由选择的数字,但您必须在您发布到谷歌播放的每个新版本上增加它,这样您就可以检查该数字是否已更改,并且知道您的应用已经已更新,您需要刷新注册。

编辑:

这也与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 :(得分:0)

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