2011-07-06 11 views
9

Google C2DMで誰かがこの問題に直面したのでしょうか?Android C2DM:同じデバイスとアプリにメッセージが重複しています

  1. ユーザーがアプリをインストールし、登録 キーのC2DMサーバに 登録:これは私が直面していたシナリオです。
  2. ユーザーがアプリをアンインストールします。
  3. ユーザーがアプリを再インストールします( は、新しい 登録キーのC2DMサーバーに登録されます)。

私のサーバーからユーザーの電話にメッセージを送信し、重複したメッセージが表示されます。

これは予期された動作であり、どのように修正できますか? おかげで、これが最良の方法ですが、関連するthreadが、ポスターは一つの技術を提供していますandroid-c2dmグループ、でオーバーがあるかどう

+1

同じメッセージを2回連続して取得することを意味しますか?これは間違いなく予想される動作ではありません。クラウドキーをアンインストールするときにクラウドキーが使用されなくなったとマークする必要があります。愚かな質問と謝罪の質問 - しかし、あなたのサーバーコードが自分のクラウドIDを騙していることは確かですか?すべてのc2dmサーバのリクエストとGoogleから返信されたレスポンスのログを保持していますか? –

答えて

7

わからない:

私は、メッセージ内の登録IDを送信しています私はそれをデバイスの格納された登録IDと照合することができます。

それは同じではない場合は、それを破棄

と登録Idが使用されなくなったサービスを通知

欠点は、Idはすでに 限られたメッセージのサイズにいくつかのスペースを取り、登録を送信しています。しかし、私のケースでは、私の 元のメッセージは長すぎる文字ではないので、完璧に動作します。

+0

すばらしいテクニック!それは非常に賢いようです – Matroska

0

私は同じ問題を抱えています。私の考えでは、Android C2DMの実装では大きな見通しです。 iOSはこれをよりうまく処理します.1つの唯一のデバイストークン(c2dm登録IDに相当)の通知を受け取ることができるからです。

私が使用する回避策は、登録IDの最後の10文字を

if (!regId.endsWith(bundle.getString("regsuffix"))) return null; 
1

別の解決策は、デバイスの一意の識別子を使用してサーバーを提供することができます私のonMessageメソッドでC2DMペイロードのと、私は次のチェックを行います。その場合、デバイスが再インストール後に登録を試みるときに、そのUUIDのregistrationIDを更新することができます。

+0

+1私のアプリケーションのアーキテクチャで同じ実装を行っています。しかし、C2DMサービスが登録が無効であると返信した場合は、登録を無効にすることができます。 –

4

これは、アプリケーションを再インストールした後の最初のプッシュ通知でのみ発生します。

Google C2DMサービスは、アンインストールされたアプリケーションの検出に関してパッシブモードで動作しています。

アプリケーションのアンインストール後(C2DMからの登録を解除せずに!!!)最初のプッシュ通知は、応答としてエラーを返しません。ただし、2回目のプッシュ通知は、アプリケーションがアンインストールされたことを認識できる「無効な登録」または「登録されていない」エラーコードを返します。

なぜなら、C2DMサーバーは応答コードをただちに返し、クライアントをプッシュしようとするからです。クライアントがアプリケーションのアンインストールを応答すると、そのアプリケーションはC2DMサーバーから削除されます。次のプッシュ試行では、エラーコードがすぐに返されます。

+0

しかし、アンインストール直後にユーザーがアプリケーションをインストールし、Reg_Idに登録するとどうなりますか?デバイスがアンインストールする前に有効だったreg_idを使用してプッシュを取得した場合。メッセージがデバイスに送信されるか、「無効な登録」が返されますか。 – Erik

+0

登録IDは、デバイス、アプリケーション、ログインしているGoogleユーザーごとに一意です。あなたが説明したシナリオでは、アプリケーションは以前のインストールと同じ登録IDを取得するので、OKであるはずです。 – Zamel

0

@Zamelと@johanの両方の回答が良好で、組み合わせる必要があります。両方のソリューションを組み合わせると、サーバーのデータベースが最小限に抑えられます。

ので、最善の解決策は、になります。既存のデバイスIDの

  • 無効化に送信されたときに、サーバー

  • 更新プッシュトークンにプッシュトークンを送信するときにデバイスIDを送信

    1. プッシュ通知が「無効な登録」または「登録されていない」エラーコードをサーバーに返す場合は、サーバーのデータベース内のプッシュトークンを使用します。

    プッシュトークンが「無効な登録」または「登録されていません」と認識された場合、無効化(ヌルとしてマーク)、データベース内の行の削除、または有効期限機能の実装が可能です。それはあなたのニーズに依存します

  • 関連する問題