2012-12-05 4 views
5

私のアプリはgcmを使用しています。ユーザーがログインするたびに、新しいgcmトークンが登録され、サードパーティのサーバーに送信されます。ユーザーがログアウトするたびに、gcmトークンは登録解除されます。これは何の問題もなく起きます。すべてのgcmトークンを無効にする

テストになると、テスターはログアウトせずにアプリケーションをアンインストールしてから、もう一度インストールして別のアカウントにログインすることができます。それから彼は2つの異なるアカウントから2つのgcmsを受け取るでしょう。これは、彼が現在ログオンしていないアカウントhesのプライベートGCを受け取ることを意味します。これは、ライブユーザが時折行うこともあります。

gcmトークンが期限切れになることがあるというGCMの文書には、アプリケーションがアンインストールされた場合は、時にはとなります。実際には、これは決して起こらない。
http://developer.android.com/google/gcm/gcm.html

GCMのドキュメントでは、あなたが

Intent unregIntent = new Intent("com.google.android.c2dm.intent.UNREGISTER"); 
unregIntent.putExtra("app", PendingIntent.getBroadcast(this, 0, new Intent(), 0)); 
startService(unregIntent); 

を実行することにより、GCMトークンの登録を解除することができます。しかし、この方法は、あなたが再インストール後にそれをしようとした場合に動作するようには思えないと述べています。トークンは登録されていないが、gcmトークンはまだ正常に動作することを伝えるコールバックを受け取る。

私の質問は、アプリケーションに有効なgcmトークンがないことを確認できますか?アプリケーションの最初の起動時に既存のトークンをすべて登録解除するか、少なくとも電話機の設定からリセットしたいと思います。

+0

こんにちはアレクセイ、あなたが行った解決策 –

+0

私はモハメド・ハフェズの提案をしました。私はユーザーIDとgcmトークンを持つテーブルを持っています。どちらのフィールドも一意です。新しいgcmトークンで既存のuserIdを受け取ると、gcmトークンが更新されます。新しいユーザーIDで既存のgcmトークンを受け取ると、私はユーザーIDを更新します。それはすべてのコーナーケースをカバーするようです。 – Alexey

+1

ユーザーが2台のデバイスにログインしている場合はどうなりますか。私はこのソリューションで2つのデバイスがgcmメッセージを受信しないことを恐れています。または何かが欠けている。 –

答えて

1

サーバーが無効な登録IDにメッセージを送信すると、エラーが表示されることがあります。私はあなたがデータベース/データストアからこれらの登録IDを削除するためにこのエラーをキャッチできると思います。 DOC(canonical id)からも

後であなたには、別の登録 IDを使用してメッセージを送信しようとした場合、GCMは、いつものように、要求を処理しますが、それは 正規の登録が含まれますID: レスポンスのregistration_idフィールドに入力します。 サーバーに保存されている登録IDをこの標準IDに置き換えてください。使用しているIDが になります。

+0

GCMの新機能ですので、わかりません – rds

+0

ありがとう、私はこれを試してみます。しかし、まだ1つの問題があります。古いトークンが置き換えられたことを理解するために、このgcmメッセージを送信する必要があります。つまり、ユーザーは、以前にログインしたユーザーからのプライベートメッセージを少なくとも1回は受信します。おそらくすべてのgcmパケットにuserIdを追加してクライアント側でチェックすることができますが、私は必要なものを達成するためのよりよい方法があることを願っています。 – Alexey

2

アプリのGCMトークンはデバイスごとに固有のものなので、他のユーザーと同じGCMトークンを使用していることを伝える別のユーザーが表示される場合は、説明した状況が発生していることがわかります。基本的には、GCMトークンを受け取るたびに、同じGCMトークンを持つ古いレコードをすべて削除してから、新しいユーザーにのみ割り当てる必要があります。

関連する問題