0

私は Android アプリケーションを開発しており、それにプッシュ通知機能を実装しています。

必要なときに通知を送信できるように、すべてのユーザートークンをサーバーに保持しています。

ただし、トークンをアプリケーションからサーバーに送信して保存する方法 (より正確にはいつ) については、助けが必要です。

現時点では、アプリケーションの初回起動時に、アプリケーションはトークンを要求し、トークンを UDID と共にサーバーに送信します。ただし、私の実装により、アプリケーションが最初に起動したときにトークンがまだ取得されていないため、空の文字列がサーバーに送信されます! もちろん2回目以降は普通に送信されます。(アプリケーションが起動するたびにサーバーに 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 です。

次回アプリケーションを起動すると、トークンは正常に送信されますが、修正する必要があります。

1 つのアイデアは、常に token に登録することです。

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

    GCMRegistrar.register(this, SENDER_ID);

GCMIntentServiceprotected void onRegistered(Context context, String regId)クラスの関数内でトークンをサーバーに送信します。そうすれば、トークンは送信する前に常に取得され、最初は null にならないようにします。

実際、これはまさに 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();
        }
    }
}

wherehandleRegistration()はトークンをサーバーに送信する関数です。

サーバーにトークンを送信し、正常に登録された場合は、使用できます

GCMRegistrar.setRegisteredOnServer(context, true);

次に、トークンがサーバーに登録されているかどうかを確認できます

GCMRegistrar.isRegisteredOnServer(context);
于 2013-05-09T05:37:34.947 に答える
0

にいる間、GCMIntentService既に UI スレッドとは別のスレッドにいます。サーバーにアプローチするのは良い点だと思います。

考えるべきことの 1 つは、フェールセーフにする方法です。GCM からの呼び出しで登録キーが返されたが、サーバーへの API 呼び出しが失敗した場合はどうなりますか。その場合、少なくとも次のアプリケーションの起動時に、サーバーへの送信を待機している登録 ID がないことを確認することをお勧めします。その場合は、それらを送信するか、GCM に再登録して手順を再実行します。

于 2013-05-08T15:47:48.533 に答える