2012-09-04 17 views
13

自分のアプリケーションでGCMを設定しました。ユーザーがアプリケーションをアンインストールするたびに、GCMからデバイスの登録を解除します。アプリケーションをアンインストールした後にGCMから登録を解除するには

私は

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

ようなコードを得たが、我々は、このコードを配置する必要がどこ..?

ありがとうございます。

+1

[GCMから登録を解除する方法](http://developer.android。co.jp/guide/google/gcm/adv.html#unreg) –

+0

ありがとうございます。そのすばらしい情報 – Sakthimuthiah

+0

このSO答えの詳細:http://stackoverflow.com/a/28057615/3913366。 –

答えて

21

アンインストール中にGCMから登録解除を呼び出すことはできません。これは、ユーザーがアプリケーションをアンインストールするときに呼び出されるメソッドがないためです。

プッシュ通知を送信すると、GCMはユーザーがアプリケーションを持っているかどうかを確認します。ユーザーがアプリケーションをアンインストールした場合、GCMは同じことを認識し、プッシュの返信の一部として通知します。

+2

本当ですか?私はアプリケーションをアンインストールした後、HTTPを使ってGCMにnotifを送りますが、GCMはまだこれを返信します:{"multicast_id":XXXXXXXX、 "success":1、 "failure":0、 "canonical_ids":0、 "results": [{"message_id": "0:XXXXXXXXX"}]} 設定に何か不足していますか? – danisupr4

+1

私の実験では、ユーザーが実際にアプリケーションをアンインストールしてから約8日後にアンインストール状態が更新されることがわかりました。時間は変わることがあります。 –

1

サーバーでこれを確認する必要があります。ユーザーがアプリケーションをいつアンインストールするかを知る方法がないため、アプリケーションコードからは実行できません。

参照:正規のIDを実装する。 参照:https://developers.google.com/cloud-messaging/http#request

正規の登録IDは、アプリケーションによって要求された最後の登録のIDであると定義されています。これは、サーバーがメッセージをデバイスに送信する際に使用するIDです。

後で別の登録IDを使用してメッセージを送信しようとすると、GCMは通常どおりリクエストを処理しますが、レスポンスのregistration_idフィールドに正式な登録IDが含まれます。サーバに保存されている登録IDをこの標準IDに置き換えてください。使用しているIDが機能しなくなります。

参考:https://stuff.mit.edu/afs/sipb/project/android/docs/google/gcm/adv.html#canonical

CanonicalのIDが0でない場合は、あなたが二重登録を持っています。

セイたとえば、あなたは、データベース内の2件の登録があります。

registration_A

をregistration_B

あなたがプッシュ通知を送信すると、サーバーは、このようなもので応答を取得します:

{"multicast_id":########,"success":1,"failure":0,"canonical_ids":1,"results": 
[{"registration_id":"new_id_registration_id","message_id":"0:########"}]} 
{"multicast_id":######### ,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:################"}]} 

このデータを配列に格納します。最初のものには "canonical_ids"があることに注意してください。これは重複があったことを意味します。あなたのデータベースのどのレコードが古いものか知るために。上記の "registration_id"を検索し、インデックス値を保存するだけです。このインデックス値は、データベース内の古いレコードを示します。

上記の例では、registration_Aは古いregistration_idになります。

データベースからすべてのレコードを取得します。検索した索引値に基づいて削除します。またはそれを更新することができます。それはデータベースの設定方法によって異なります。

幸運を祈る!

関連する問題