我知道在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发送到我的服务器。但是之前的代码向我们展示了这个函数只会调用一次!那么当令牌改变时会发生什么?我如何刷新它到我的服务器?我想每次应用启动时我都应该运行这个功能......
我在这里遗漏了什么吗?代码错了吗?任何想法都会有所帮助:)
答案 0 :(得分:10)
Google表示,如果注册ID在您注册时发生更改,则会再次发送注册sontnt,因此您的应用将在“onRegistered”中获取新的注册ID,而无需在每次发布时请求新的注册。
请注意,Google可能会定期刷新注册ID,因此您应该设计Android应用程序,并了解可能会多次调用com.google.android.c2dm.intent.REGISTRATION意图。您的Android应用程序需要能够做出相应的响应。
(摘自here)
因此上面的代码应该没问题。实际上,如果您更新应用版本,此代码将返回空注册ID,这将触发新注册。
也就是说,每次启动应用程序时注册都比较安全。