11

LoginActivityとし、ユーザーは既存の資格情報で登録またはログインすることができます。ユーザーがログインしていてアプリケーションのMainActivityが起動していない限り、FirebaseInstanceIdServiceにトークンを生成させたくありません。 。FCM IDサービスを起動するには、特定のアクティビティが起動された後でなければなりませんか?

ユーザーがログインしているまで、あなたが呼び出されてからFirebaseInstanceIdService.onTokenRefresh()をブロックすることはできませんあなた

+0

ちょうどあなたの 'MainActivity'の'のonCreate() ''でFirebaseInstanceId.getInstance()。入手トークンを() 'を呼び出します。またはアクティビティのどこにいてもそれが必要になると思います。 –

+0

ログによれば、私の 'FirebaseInstanceIdService'実装はアプリケーション起動時にトークンを生成します。私がこれを防ぐ方法はありますか? – Bravo

+0

申し訳ありません。私は少し混乱しています。あなたは 'FirebaseInstanceIdService.onTokenRefresh()'を参照していますか? –

答えて

14

ありがとう

あなたのユースケースには何ができるかは、次のとおりです。FirebaseInstanceIdService.onTokenRefresh()

  • イベントを無視した場合ユーザはログインしていません
  • ユーザログインがFirebaseInstanceId.getToken()で、!= nullであればonTokenRefresh()(またはあなたのロジックに直接)コールしますma毎回。

この方法では、ユーザーがログインしているときにトークンを処理できます。トークンが利用できない場合(または回転している場合)は、onTokenRefresh()イベントを後で受信します。

アップデート(2017年7月3日)は:コメントで読者がFirebaseInstanceIdService.onTokenRefresh()は、ユーザーログ後に呼び出される可能性があることを思い出し

これは権利です。ユーザーがログインすると、onTokenRefresh()が以前に呼び出されていない場合は、nullを返すことができます。

あなたのアプリでこのケースを持っている必要があります。ほとんどの場合、ユーザーはアプリを使用できますが、トークンを受け取るまでプッシュ通知を送信することはできません。

最後にonTokenRefresh()が呼び出されたときに、ユーザーが以前にログインした場合、トークンをユーザーに関連付けることができます。

+0

ユーザログイン後にFirebaseInstanceIdService.onTokenRefresh()が呼び出された場合、非同期呼び出しですか? –

+0

これは起こり得ることで、アプリでケースを処理する必要があります。ほとんどの場合、ユーザーはアプリを使用できますが、トークンを受け取るまでプッシュ通知を送信することはできません。トークンを受け取ったら、以前にログインしたユーザーにトークンを関連付けることができます。 (私も答えを更新しました) –

+0

niceですが、私はインスタンスを削除し、ログインの後に 'getInstance()'メソッドを呼び出す必要があると思います。 –

3

申し訳ありませんが、それはできません。 FirebaseInstanceIdServiceは、アプリケーションの起動時に自動的に呼び出され、Tokenを生成します。そのアプリケーションと関連していることを覚えておいてくださいInstance。特定のユーザーではありません。 1つの特定のユーザー(つまり、ユーザーがログインしたときにTokenを保存しようとしている場合は、そのユーザーのプッシュ通知のためにサーバーのtokenを保存します)。これを行う場合、今後発生するバグは2つのユーザーが1つのアプリケーションを共有Instanceプッシュ通知が間違ったユーザーにプッシュされる可能性があります.. あなたは私のポイントを得ることを願っています。

+2

こんにちは。この問題を解決するには?たぶん私のサーバー上のログアウトしたユーザーからトークンの関連付けを削除し、それを新しくログインしたユーザーに追加しています...あなたはどう思いますか? – Alessandro

+0

@Alessandroはい私は問題がありました..あなたが言及したことをしました –

+0

ありがとう、私は同じことをやっている! :) – Alessandro

0

gcmトークンがサーバーに送信されたかどうかを示す共有フラグに1つのフラグを維持しています。私が1つのメソッドsendDevicetokenToServerを呼び出すたびに、スプラッシュ画面で。このメソッドは、ユーザIDが空でないかどうかをチェックし、gcmがステータスを送信してからトークンをサーバに送信します。

public static void sendRegistrationToServer(final Context context) { 

    if(Common.getBooleanPerf(context,Constants.isTokenSentToServer,false) || 
      Common.getStringPref(context,Constants.userId,"").isEmpty()){ 

     return; 
    } 

    String token = FirebaseInstanceId.getInstance().getToken(); 
    String userId = Common.getUserId(context); 
    if(!userId.isEmpty()) { 
     HashMap<String, Object> reqJson = new HashMap<>(); 
     reqJson.put("deviceToken", token); 
     ApiInterface apiService = 
       ApiClient.getClient().create(ApiInterface.class); 

     Call<JsonElement> call = apiService.updateDeviceToken(reqJson,Common.getUserId(context),Common.getAccessToken(context)); 
     call.enqueue(new Callback<JsonElement>() { 
      @Override 
      public void onResponse(Call<JsonElement> call, Response<JsonElement> serverResponse) { 

       try { 
        JsonElement jsonElement = serverResponse.body(); 
        JSONObject response = new JSONObject(jsonElement.toString()); 
        if(context == null){ 
         return; 
        } 
        if(response.getString(Constants.statusCode).equalsIgnoreCase(Constants.responseStatusSuccess)) { 

         Common.saveBooleanPref(context,Constants.isTokenSentToServer,true); 
        } 
       }catch (Exception e){ 
        e.printStackTrace(); 
       } 
      } 

      @Override 
      public void onFailure(Call<JsonElement> call, Throwable throwable) { 

       Log.d("", "RetroFit2.0 :getAppVersion: " + "eroorrrrrrrrrrrr"); 
       Log.e("eroooooooorr", throwable.toString()); 
      } 
     }); 

    } 

} 
MyFirebaseInstanceIDServiceクラスで

@Override 
public void onTokenRefresh() { 
    // Get updated InstanceID token. 
    String refreshedToken = FirebaseInstanceId.getInstance().getToken(); 
    Log.d(TAG, "Refreshed token: " + refreshedToken); 

    // If you want to send messages to this application instance or 
    // manage this apps subscriptions on the server side, send the 
    // Instance ID token to your app server. 
    Common.saveBooleanPref(this,Constants.isTokenSentToServer,false); 
    Common.sendRegistrationToServer(this); 

} 
関連する問題