每次启动我的 Android 应用程序时是不是都需要一个新令牌?
Posted
技术标签:
【中文标题】每次启动我的 Android 应用程序时是不是都需要一个新令牌?【英文标题】:Should i require a new token every time i launch my Android App?每次启动我的 Android 应用程序时是否都需要一个新令牌? 【发布时间】:2013-05-09 08:14:23 【问题描述】:我知道在 android 中与在 ios 和 WP7 中一样(In which mobile platforms the “push token” is not permanent?) 提供给设备的推送令牌CAN会发生变化。
这意味着我们应该通过要求一个新的令牌来处理这个问题,至少每次我们的应用程序启动时都是这样。
然而,这与我迄今为止在谷歌教程中发现的完全矛盾。(我不记得我在哪里找到了这段代码,但我很确定它是提供的by google) 代码如下所示:
//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(Context context, String regId): 在收到注册意图后调用,将 GCM 分配的注册 ID 作为参数传递给该设备/应用程序对。通常,您应该将 regid 发送到您的服务器,以便它可以使用它向此设备发送消息。
所以它说我应该将此 id 发送到我的服务器。但是之前的代码告诉我们这个函数只会被调用一次!那么当令牌发生变化时会发生什么?我将如何将它刷新到我的服务器?我想我应该在每次应用启动时都运行这个函数...
我在这里错过了什么吗?代码错了吗?任何想法都会有所帮助:)
【问题讨论】:
【参考方案1】:Google 表示,如果在您已注册的情况下注册 ID 发生更改,则将再次发送注册意图,因此您的应用将在“onRegistered”中获取新的注册 ID,而无需在每次启动时请求新的注册。
请注意,Google 可能会定期刷新注册 ID,因此您在设计 Android 应用程序时应了解 com.google.android.c2dm.intent.REGISTRATION 意图可能会被多次调用。您的 Android 应用程序需要能够做出相应的响应。
(取自here)
因此上面的代码应该没问题。实际上,如果您更新应用版本,此代码将返回一个空注册 id,这将触发新的注册。
也就是说,对我来说,每次启动应用程序时进行注册似乎更安全。
【讨论】:
谢谢伊兰。您的回答总是很有帮助! 非常好...你还记得记录在哪里吗? @Turnsole 我添加了报价。虽然这个引用是指旧的注册 API。我不确定它与新的 GCMCloudMessaging API 的相关性如何。 @Eran 有没有办法使旧的注册 ID 无效?这将补充答案。谢谢以上是关于每次启动我的 Android 应用程序时是不是都需要一个新令牌?的主要内容,如果未能解决你的问题,请参考以下文章