ここに示すように、アプリの通知に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間の一貫性を確保するための最も簡単でクリーンな方法は何ですか? ありがとう。