8

我知道在 Android 和 iOS 和 WP7 中(在哪些移动平台中,“推送令牌”不是永久性的?)提供给设备的推送令牌可以更改

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

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

        //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); 只执行一次该行,即应用程序第一次启动。但我想这是错的吧?因为如果令牌发生变化,我们的应用程序将无法看到它,因为它只需要一次令牌......

编辑


实际上,我刚刚找到了该代码的确切位置。看看这里:入门指南

我引用:

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

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

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

4

1 回答 1

10

谷歌表示,如果在你已经注册的情况下注册 id 发生变化,注册意图将被再次发送,因此你的应用将在“onRegistered”中获得新的注册 id,而无需在每次启动时请求新的注册。

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

(取自这里

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

也就是说,每次启动应用程序时注册对我来说似乎更安全。

于 2013-05-09T08:37:26.770 回答