web-dev-qa-db-ja.com

Androidの登録IDを使用してGCMからデバイスを登録解除します

データベーステーブルにGCMに登録されたユーザーとそれに対応する登録IDのリストがあり、実際にユーザーがテーブルから削除されるたびにユーザーの登録を解除したい。私はここStackoverflowで多くの例を見つけましたが、それらのほとんどは現在非推奨となっている古いGCMRegistrar APIに基づいています。私はGoogleCloudMessaging APIを使用しており、次の方法でユーザーを登録しています。

private void registerUser(){
        GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(getBaseContext());
        String regId = "";
        try {
            regId = gcm.register(getString(R.string.project_number));
            Log.i("registrationId", regId);
        } 
        catch (IOException e) {
            Log.i("Registration Error", e.getMessage());
        }
}

すべてのユーザーに通知をプッシュするため、サードパーティのアプリケーションサーバーとして機能する管理者アプリがあります。次の方法で、この管理者アプリから特定のユーザーの登録を解除したい:

private void unRegister(String regId) {

        GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(getBaseContext());
        try {
            gcm.unregister();
        } 
        catch (IOException e) {     
        System.out.println("Error Message: " + e.getMessage());
        }

   }

しかし、unregister()メソッドは登録IDを引数として取りません。これにより、特定のデバイスの登録を解除することができなくなります。登録IDによってGCMから特定のデバイスを登録解除する方法はありますか?.

15
Osman Esen

このメソッドはトリックを行います:

gcm.unregister();

ただし、gcm.unregister()は非推奨になったため、次のいずれかを使用する必要があります。

InstanceID.deleteToken()またはInstanceID.deleteInstanceID()。

これらのメソッドは、次のパラメーターを取ります。

public void deleteToken (String authorizedEntity, String scope)

削除するエンティティを承認済みエンティティにしています...

//以下の説明IS "登録解除"のみ

だから、あなたのコメントに基づいて:

しかし、unregister()メソッドは登録IDを引数として取りません。そのため、特定のデバイスの登録を解除することができません。

それはあなたがそれがそうではない方法で機能することを期待しているからです。あなたはuregisterにパラメータを渡すhttpリクエストを作成したいようです(例: " http://www.gcmserver.com?unregisterid=xxxx ")、そしてそれはそうではありませんこれは、Googleのドキュメントに基づいて機能する方法です。

登録解除のしくみ

アプリケーションは、デバイスからアンインストールされた後、自動的に登録解除できます。ただし、Androidはアンインストールコールバックを提供しないため、このプロセスはすぐには実行されません。このシナリオでは次のようになります。

エンドユーザーがアプリケーションをアンインストールします。

サードパーティのサーバーがGCMサーバーにメッセージを送信します。

GCMサーバーはメッセージをデバイスに送信します。

GCMクライアントはメッセージを受信し、メッセージを受信するように構成されているブロードキャストレシーバーがあるかどうかについてパッケージマネージャーに問い合わせます。

GCMクライアントは、アプリケーションがアンインストールされたことをGCMサーバーに通知します。

GCMサーバーは、登録IDに削除のマークを付けます。

サードパーティのサーバーがメッセージをGCMに送信します。

GCMは、NotRegisteredエラーメッセージをサードパーティのサーバーに返します。

サードパーティが登録IDを削除します。

したがって、それに基づいて、gcm.unregister()メソッドが実際に行うことは、そのデバイスを削除対象としてマークし(実際にアプリをアンインストールせずにプロセスの最初のステップを強制するものと考える)、サーバーに不要になったことを通知します通知を取得するには、「Id」をパラメータとして使用しないことも、その特定のデバイスを参照していることを意味します。

よろしく!

21
Martin Cazares

unregister()は廃止されました:

https://developers.google.com/Android/reference/com/google/Android/gms/gcm/GoogleCloudMessaging.html#unregister()

あなたが呼ぶべきドキュメントを引用して:

Instead use InstanceID.deleteToken() or InstanceID.deleteInstanceID().
4
Felipe Duarte