0

我正在开发一个 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)那样,因为检索新令牌的调用是异步的,并且发生在我将数据发送到我的服务器之后,所以它是 null。

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

一种想法是始终注册 token :

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

    GCMRegistrar.register(this, SENDER_ID);

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

实际上,这正是 iOS 应用程序中的工作方式。通常,您在检索它的函数内将令牌发送到您的服务器,以便在您尝试发送它之前确定它实际上会在那里。

这种方法正确吗?你怎么看?

4

2 回答 2

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);
于 2013-05-09T05:37:34.947 回答
0

当您在其中时,GCMIntentService您已经在与 UI 线程不同的线程上。我会说这是接近您的服务器的好点。

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

于 2013-05-08T15:47:48.533 回答