2016-04-02 9 views
0

私は自分のアプリでGCMを使用しており、InstanceId APIを使用してGCMトークンを生成しています。私はInstanceId APIによって返されたトークンが無効であるこの問題に直面しています。InstanceID APIによって返されたGCMトークンはNotRegisteredエラーを返します

私はPostmanを使用してトークンをチェックしています。そして、あるデバイスでは、トークンを使用しようとすると、NotRegisteredエラーがスローされます。しかし、私が強制的にGCMInstanceIdListenerサービスを実行すると、GCMRegistrationServiceが再度呼び出され、今度は正しいトークンを取得します。

GCMRegistrationServiceで受け取ったトークンが有効かどうかを確認する方法はありますか?私はhttps://android.googleapis.com/gcm/sendを呼び出してトークンを確認することができますが、ヘッダーに渡されるサーバーキーが必要であり、クライアントに保管したくありません。

これは私のコードがどのように見えるかです:

public class GCMInstanceIdListener extends InstanceIDListenerService { 

    @Override 
    public void onTokenRefresh() { 
     Intent intent = new Intent(this, GCMRegistrationService.class); 
     startService(intent); 
    } 
} 


public class GCMRegistrationService extends IntentService { 
    private static final String TAG = "GCMRegistrationService"; 

    public GCMRegistrationService() { 
     super(TAG); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     InstanceID instanceID = InstanceID.getInstance(this); 
     String token = instanceID.getToken(BuildConfig.GCM_SENDER_ID, 
       GoogleCloudMessaging.INSTANCE_ID_SCOPE, null); 
     Log.d(TAG, "GCM Token : " + token); 
    } 
} 

答えて

0

アップあなたのGCMRegistrationServiceたびにアプリが起動を実行し、あなたがクライアント上でローカルに保存されているトークンが1に受け取っ一致するかどうかを確認します。

@Override 
protected void onHandleIntent(Intent intent) { 
    String token = InstanceID.getInstance(this).getToken(BuildConfig.GCM_SENDER_ID, 
      GoogleCloudMessaging.INSTANCE_ID_SCOPE, null); 

    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 

    String savedToken = prefs.getString("token", ""); 

    if(!token.equals(savedToken)) { 
     prefs.edit().putString("token", token).apply(); 
     sendTokenToBackend(token); // If needed 
    } 
} 

EDIT:また、あなたがGET_ACCOUNTS権限を持っていることを確認してください。最近、私のアプリからこの許可を削除し、私のデバイスでNotRegisteredエラーが発生しました。アプリがAPI 23+をターゲットにしている場合は、実行時にこの権限をリクエストする必要があります。

+0

私はそれを行うことができましたが、私たちのユースケースでは、初めてアプリケーションを開くとすぐにユーザーにプッシュメッセージを送信する必要があります。 'GCMRegistrationService'を実行すると、2回目以降のみに役立ちます。クリーンインストールでも、初めてGCMRegistrationServiceが呼び出されたとき、私は無効なトークンを取得します。 – akshayt23

+0

Googleのgcmクライアントの例に従ってみませんか?ローカルブロードキャストを使用して、登録が完了したことをアクティビティに通知します。残りのロジックを進めることができます。無効なトークンについては、あなたのgoogle-services.jsonがフォールト(ファイルが破損している)か、GET_ACCOUNTS権限(Android 6.0+権限の問題あり、おそらく)がないことが考えられます。 – Rohan

+0

うーん、私はそれを確認します。私たちのマニフェストには 'GET_ACCOUNTS'パーミッションがありますが、jsonファイルを数回再コピーしましたが、問題は解決しません。 – akshayt23

関連する問題