我每次启动Android应用程序时都需要新的令牌吗?

时间:2013-05-09 08:14:24

标签: android push-notification push google-cloud-messaging

我知道在iOS和WP7中使用Android(In which mobile platforms the “push token” is not permanent?),提供给设备的推送令牌 CAN 会发生变化。

这意味着我们应该通过要求新令牌来处理这个问题,至少每次我们的应用程序启动时都会这样做。

然而,这与我迄今为止在谷歌教程中发现的内容完全矛盾。(我无法记住我在哪里找到了这段代码,但我很确定它是提供的通过谷歌)代码看起来像这样:

        //registering for push
        GCMRegistrar.checkDevice(this);
        GCMRegistrar.checkManifest(this);
        final String regId = GCMRegistrar.getRegistrationId(this);
        if (regId.equals("")) {
          GCMRegistrar.register(this, SENDER_ID);
          Log.i("****************","I just Registered!!");
        } else {
          Log.i("****************","Already registered");
        }

上面的代码只会在应用程序第一次启动时执行一次GCMRegistrar.register(this, SENDER_ID);行。但我猜这不对吗?因为如果令牌发生变化,我们的应用程序就无法看到它,因为它只需要一次令牌..

修改


实际上我刚刚找到了该代码的确切位置。看看这里:Get Started Guide

我引用:

在onCreate()方法中,添加以下代码:

GCMRegistrar.checkDevice(this);
GCMRegistrar.checkManifest(this);
final String regId = GCMRegistrar.getRegistrationId(this);
if (regId.equals("")) {
  GCMRegistrar.register(this, SENDER_ID);
} else {
  Log.v(TAG, "Already registered");
}

注册设备时,会调用onRegistered(Context context, String regId):功能。关于这个函数,教程说:

onRegistered(上下文上下文,字符串注册): 在收到注册意图后调用,将GCM分配的注册ID作为参数传递给该设备/应用程序对。通常,您应该将regid发送到您的服务器,以便它可以使用它向此设备发送消息。

所以它说我应该将此ID发送到我的服务器。但是之前的代码向我们展示了这个函数只会调用一次!那么当令牌改变时会发生什么?我如何刷新它到我的服务器?我想每次应用启动时我都应该运行这个功能......

我在这里遗漏了什么吗?代码错了吗?任何想法都会有所帮助:)

1 个答案:

答案 0 :(得分:10)

Google表示,如果注册ID在您注册时发生更改,则会再次发送注册sontnt,因此您的应用将在“onRegistered”中获取新的注册ID,而无需在每次发布时请求新的注册。

  

请注意,Google可能会定期刷新注册ID,因此您应该设计Android应用程序,并了解可能会多次调用com.google.android.c2dm.intent.REGISTRATION意图。您的Android应用程序需要能够做出相应的响应。

(摘自here

因此上面的代码应该没问题。实际上,如果您更新应用版本,此代码将返回空注册ID,这将触发新注册。

也就是说,每次启动应用程序时注册都比较安全。