来自GCM docs:
更新应用程序时,应使其现有文件无效 注册ID,因为它不能保证与新版本一起使用。 因为应用程序没有调用生命周期方法 更新,实现此验证的最佳方法是存储 存储注册ID时的当前应用程序版本。然后 启动应用程序时,将存储的值与 当前的应用版本。如果它们不匹配,则使其无效 存储数据并再次开始注册过程。
如果文档声明“无法保证使用新版本”是GCM限制,还是他们推测应用从版本到版本的行为可能会发生变化?
从应用程序方面,我可以或多或少地保证连续版本在GCM和我编写的任何特定于应用程序的消息格式方面都能正常运行。我还需要重新注册吗?
如果是,我应该使用哪个来检测“新版本”:版本代码或版本名称?我的理解是这些是“自由形式”,应用程序开发人员将它们设置为他选择的任何值。那么,如果我在商店中添加应用更新但不更改versionName或versionCode,该怎么办?我需要重新注册GCM吗?
似乎GCM 实际上想要的是,每次首次启动新安装时(每次连续启动直到注册完成),应用程序都会重新注册,无论如何versionName和versionCode中的值。这是一个准确的陈述吗?
答案 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商店提交新版本时,都会强制更改版本代码,因此您可以依赖它来检测应用的版本。