栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在Android上处理Google Cloud Messaging中的注册ID更改

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在Android上处理Google Cloud Messaging中的注册ID更改

这是一个有趣的问题。

Google鼓励您切换到新的注册流程:

在移动设备上运行的Android应用程序通过调用GoogleCloudMessaging方法register(senderID …)进行注册以接收消息。此方法注册GCM的应用程序并返回注册ID。这种简化的方法取代了之前的GCM注册流程。

Google may periodically refresh the registration ID仅显示仍显示旧注册过程的页面上的注释,因此该注释可能不再有用。

为了安全起见,您仍然可以使用旧的注册流程。或者,您可以使用新流程,但另外还有处理com.google.android.c2dm.intent.REGISTRATION意图的代码,以确保Google确实决定刷新注册ID时可以确保您被覆盖。

就是说,我从未经历过这样的刷新,即使我确实遇到了注册ID的更改(通常是由于卸载应用程序后再发送通知然后重新安装它而发送的通知),但旧的注册ID仍然起作用(导致Google响应中发送了规范的注册ID),因此没有造成任何伤害。

编辑(06.06.2013):

Google更改了其演示应用程序以使用新界面。他们通过在应用程序本地保留的值上设置过期日期来刷新注册ID。应用启动时,他们会加载其本地存储的注册ID。如果它已“过期”(在演示中这意味着它是7天前从GCM收到的),他们会gcm.register(senderID)再次致电。

这不适用于假设的情况,在这种情况下,Google会为长时间未启动的应用刷新注册ID。在这种情况下,应用程序将不会知道更改,第三方服务器也不会。

public void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.main);    mDisplay = (TextView) findViewById(R.id.display);    context = getApplicationContext();    regid = getRegistrationId(context);    if (regid.length() == 0) {        registerBackground();    }    gcm = GoogleCloudMessaging.getInstance(this);}private String getRegistrationId(Context context) {    final SharedPreferences prefs = getGCMPreferences(context);    String registrationId = prefs.getString(PROPERTY_REG_ID, "");    if (registrationId.length() == 0) {        Log.v(TAG, "Registration not found.");        return "";    }    // check if app was updated; if so, it must clear registration id to    // avoid a race condition if GCM sends a message    int registeredVersion = prefs.getInt(PROPERTY_APP_VERSION, Integer.MIN_VALUE);    int currentVersion = getAppVersion(context);    if (registeredVersion != currentVersion || isRegistrationExpired()) {        Log.v(TAG, "App version changed or registration expired.");        return "";    }    return registrationId;}private boolean isRegistrationExpired() {    final SharedPreferences prefs = getGCMPreferences(context);    // checks if the information is not stale    long expirationTime = prefs.getLong(PROPERTY_ON_SERVER_EXPIRATION_TIME, -1);    return System.currentTimeMillis() > expirationTime;}

编辑(08.14.2013):

Google再次更改了他们的演示应用程序(两天前)。这次,他们删除了认为注册ID在7天后过期的逻辑。现在,他们仅在安装新版本的应用程序时刷新注册ID。

编辑(04.24.2014):

为了完整起见,这里是海东青Manolache(摘自的话在这里),谷歌的开发者参与GCM的发展,对此事:

从未发生过“定期”刷新,并且新GCM库中不包括注册刷新。

注册ID更改的唯一已知原因是应用程序的旧错误,如果它们在升级时收到消息,则会自动取消注册。在修复此错误之前,应用程序仍需要在升级后调用register(),到目前为止,在这种情况下,注册ID可能会更改。通常显式调用unregister()通常也会更改注册ID。

建议/解决方法是生成您自己的随机标识符,例如,保存为共享首选项。在每次应用升级时,您都可以上传标识符和可能的新注册ID。这也可能有助于跟踪和调试服务器端的升级和注册更改。

这说明了官方GCM演示应用程序的当前实现。 com.google.android.c2dm.intent.REGISTRATION使用GoogleCloudMessaging该类进行注册时,切勿处理。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/369571.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号