私のアプリは、GoogleのC2DM(プッシュ通知)を使用して、友人からの新しいアクティビティについてユーザーに通知しています。アプリをインストールしたら、デバイスをC2DMサーバーに登録し、ユーザーの電話番号を保存します。そのため、ユーザーがアプリを使用していることを知っており、プッシュ通知を送信できます。しかし、ユーザーがアプリをアンインストールするとどうなりますか。アプリでキャッチする方法はありますか?または、唯一の方法は、C2DMを送信して到達不能なときにサーバーでエラーをキャッチし、ユーザーを非アクティブとしてマークすることですか?
友人がアプリを使用しているとき、および使用しなくなったときに、ユーザーに通知したいと思います。
このシナリオに最適なソリューションは何ですか?
残念ながら、ACTION_PACKAGE_REMOVEDインテントは、自分以外のすべての受信者に送信されます。これは確認されました here 。
私はC2DMプランにあまり詳しくないので、C2DMプランに関するいくつかの質問。ユーザーがデバイスを長時間オフのままにすると、使用するエラー状態がトリガーされますか? C2DMは実際に「到達不能」デバイスをどのように報告しますか?それは、プッシュ通知を送信しようとして失敗した場合にのみ発生する条件ですか、それとも何らかの方法でデバイスに到達したが適切に処理できないと判断した場合ですか?明らかに、2番目のシナリオでは計画が機能しますが、そうでない場合は「誤検知」が発生することがわかります。
以前のSO参照用の質問: Androidは削除されたパッケージでIntent ACTION_PACKAGE_REMOVEDを受信していません
GCMのドキュメントでは、この状況について説明しています。
「アプリケーションはデバイスからアンインストールされた後、自動的に登録解除できます。ただし、このプロセスはAndroidはアンインストールコールバックを提供しないため、すぐには発生しません。]
基本的に、GCMが次のプッシュ通知を送信しようとすると、デバイスは受信アプリケーションがアンインストールされたことをGCMに通知します。
友人がアプリを使用していないことを友人に通知する場合、GCMはこのエラーが発生したときに通知サーバーにNotRegistered
エラーを送信します。すぐにではありませんが、それを使用できますか?
はい、でもかなりハッキーです。この方法は、アプリをアンインストールするときに最初に行うAndroidがデータファイルの削除であるという事実に基づいています。そのため、ファイルウォッチャーを使用して削除を検出できます。 Javaでコードを記述すると、コードを実行する前にアプリがアンインストールされます。このデモを参照してください: https://github.com/sevenler/Uninstall_Statics
Google C2DMサービスは、アンインストールされたアプリケーションの検出に関してはパッシブモードで動作しています。
(C2DMから登録解除せずに)アプリケーションをアンインストールした後の最初のプッシュ通知は、応答でエラーを返しません。ただし、2番目のプッシュ通知は、アプリケーションがアンインストールされたことを認識できる「無効な登録」または「未登録」エラーコードを返します。
その理由は、C2DMサーバーがすぐに応答コードを返し、その後クライアントをプッシュしようとするためです。アプリケーションがアンインストールされたことをクライアントが応答すると、C2DMサーバーから削除されます。次回のプッシュ試行では、エラーコードがすぐに返されます。
本文に「NotRegistered」メッセージが含まれるサーバー応答200を使用する方法は1つしかありません。
NotRegistered — registration_idは無効になりました。たとえば、ユーザーがアプリケーションをアンインストールしたか、通知をオフにしました。送信者は、このデバイスへのメッセージの送信を停止する必要があります。
私はあなたに伝えるいくつかのポイントがあります、
サーバーからGCMにメッセージを送信すると、応答文字列が返されます。「NotRegistered」というエラーが表示される場合は、アプリケーションがデバイスからアンインストールされたか、またはcom.google.Android.c2dm.intent.RECEIVEインテントを受信するように構成されたブロードキャストレシーバー。」
このGCMドキュメントをご覧ください: GCM Unregistration
アプリの登録を解除しないでください。これはサーバー側から注意が払われます。