10

来自 GCM文档

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

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

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

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

似乎 GCM真正想要的是应用程序在每次首次启动新安装时重新注册(并且每次连续启动直到注册完成),无论 versionName 和 versionCode 中的值如何。这是一个准确的说法吗?

4

2 回答 2

13

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

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

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

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

编辑:

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

请参阅:http: //developer.android.com/google/gcm/client.html以及所有详细信息。

特别是这段代码, wheregetRegistrationId将返回一个空字符串,以防版本代码更改迫使客户端再次注册:

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

            if (regid.isEmpty()) {
                registerInBackground();
            }
        } else {
            Log.i(TAG, "No valid Google Play Services APK found.");
        }
于 2012-07-10T22:26:34.977 回答
0

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

于 2013-03-22T22:47:32.953 回答