3

ここに示すように、アプリの通知にGCMを使用しています。コードは定型文です:

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()コールバックは返された登録IDでサーバーを更新します。

ただし、GCMが一貫性のない状態になることがあります。GCMRegistrar.getRegistrationId()あるケースでは、空でない登録ID文字列が表示されても、通知は転送されません。それ以外の場合は、2つ以上の重複メッセージが表示されることになります。

これらの状況を回避するために、私は現在、次のように機能するブルートフォースソリューションを持っています。

if (GCMRegistrar.isRegistered(this))
    GCMRegistrar.unregister(this);
else
    GCMRegistrar.register(this, GCMConstants.SENDER_ID);

onUnregistered()コールバックで、サーバーに登録IDを削除するように指示してから、を呼び出しますGCMRegistrar.register()onRegistered()コールバックで、登録IDを追加し直すようにサーバーに指示します。

これまでのところ、機能していますが、これが機能するはずの方法よりも明らかに効率が低く、不整合の問題の影響を受けないかどうかはわかりません。getRegistrationId()常に有効なID、つまり現在の/正規の登録IDを返すことを期待できればもっと良いでしょう。

アプリ、サーバー、GCM間の一貫性を確保するための最も簡単でクリーンな方法は何ですか? ありがとう。

4

1 に答える 1

2

重複メッセージを取得する問題は、Googleから取得した応答を解析し、応答で正規の登録IDを受信する状況を特定することで解決できます。この場合、古い登録IDを削除し、代わりに正規のIDを保持することができます。

強引な解決策よりも優れた解決策はregister、アプリの起動時に常に電話をかけることだと思います。前回の通話で取得したのと同じ登録IDで受信する場合がありonRegistered()ますが、その登録IDをデバイスに保持すると、保持したIDを受信したIDと比較して、サーバーに登録IDを再送信しないようにすることができます。変わらない。

于 2013-03-21T16:21:51.303 に答える