如何在Android中处理令牌?

时间:2013-05-08 15:43:09

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

我正在开发一个Android应用程序,我正在实现推送通知功能。

我在服务器上保留所有用户令牌,以便我可以在需要时向他们发送通知。

但是 ,我需要一些帮助,说明如何(或更准确地说)何时将令牌从应用程序发送到我的服务器进行保存。

目前,应用程序首次启动时,应用程序会请求令牌,然后将令牌和UDID一起发送到我的服务器。但是由于我的实现,第一次应用程序启动时,尚未检索到令牌,因此将一个空字符串发送到我的服务器!当然第二次和令牌正常发送。 (我每次启动应用程序时都会将udid和令牌注册到我的服务器上)

代码看起来像这样:

    //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");
    }

    final String android_id = Secure.getString(this.getContentResolver(),Secure.ANDROID_ID);

    String jsonString = "{\"deviceUUID\":\"" + android_id + "\",\"os\":\"android\", \"pushToken\":\"" + GCMRegistrar.getRegistrationId(this) + "\"}";

 . . . Sending the jsonString to my server . . . 

正如您第一次看到GCMRegistrar.getRegistrationId(this)为空,因为检索新令牌的调用是 asychronous ,并且在我将数据发送到服务器后发生。

下次启动应用程序时,令牌将正常发送,但需要修复。

一个想法是始终注册令牌:

    //registering for push
    GCMRegistrar.checkDevice(this);
    GCMRegistrar.checkManifest(this);

    GCMRegistrar.register(this, SENDER_ID);

并在 GCMIntentService 类的protected void onRegistered(Context context, String regId)函数内部将令牌发送到我的服务器。这样,在发送之前总是会检索令牌,并且确保第一次永远不会为空。

实际上,这正是iOS应用程序中的完成方式。通常你会在检索它的函数内部将令牌发送到你的服务器,这样你就可以确定它在你尝试发送之前确实存在了。

这种做法是否正确?你觉得怎么样?

2 个答案:

答案 0 :(得分:1)

如果您使用的是GCM库,则应在服务器

中注册令牌
protected void onRegistered(Context context, String registrationId)

如果您没有使用库,那么您将在GCMIntentService

中执行类似的操作
@Override
public final void onHandleIntent(Intent intent) {
    try {
        String action = intent.getAction();
        if (action.equals("com.google.android.c2dm.intent.REGISTRATION")) {
            handleRegistration(intent);
        } else if(action.equals("com.google.android.c2dm.intent.RECEIVE")){
            handleMessage(intent);
        }
    } finally {
        synchronized (LOCK) {
            sWakeLock.release();
        }
    }
}

其中handleRegistration()是将令牌发送到服务器的函数。

当您向服务器发送令牌并成功注册时,您可以使用

GCMRegistrar.setRegisteredOnServer(context, true);

然后,您可以使用

了解令牌是否已在服务器中注册
GCMRegistrar.isRegisteredOnServer(context);

答案 1 :(得分:0)

当你在GCMIntentService时,你已经在UI线程的一个单独的线程上了。我会说接近你的服务器是个好点。

您应该想到的一件事是如何使其安全失败。当来自GCM的呼叫返回注册密钥但您对服务器的api呼叫失败时会发生什么。在这种情况下,我建议至少在下一个应用程序启动时检查您是否有任何注册ID等待发送到服务器,如果是,请发送它们或者只是重新注册到GCM并让程序再次发生。

相关问题