web-dev-qa-db-ja.com

Firebase FCMトークン-サーバーに送信するタイミング

わかりましたので、最初の起動時にいくつかの歓迎スライドを案内し、ログイン/登録ページに移動し、MainActivityに移動するアプリがあります。

FCMを実装したばかりで、サービスはtokenを生成しますbeforeこれらのページはユーザーに表示されています。サービスが実行されるようにするにはどうすればよいですかafterMainActivityに到達しますか?

問題は、MySQL DBに更新されるとすぐにトークンを適切なユーザーアカウントに送信しようとすることですが、ユーザーがまだサインインしていないため、nullサーバーへのメッセージが失敗します。これを設計する良い方法は何ですか?トークンをSharedPreferencesに保存し、ユーザーがログインした後にサーバーに送信することを考えましたが、トークンが後で更新されると多くの問題が発生しますか?!

可能な解決策

2つのサービスがどのように実行されるかを完全に理解しているかはわかりませんが、onTokenRefreshでトークンをSharedPreferencesに保存し、MainActivityでSPから値を取得してからサーバーに送信します。その場合、トークンが更新されると、新しい値はすぐにSharedPreferencesに再び入ります。ただし、SPの新しい値であるかどうかを確認してから、サーバーに再アップロードする必要があります。これは混乱を招きます!

17
iBobb

はいFCMトークンは自動的に生成されます。しかし、これを別の角度から見てみてください。

これは私がそれを処理した方法です。

アプリが起動したらすぐにFCMにトークンを生成させます。 OnTokenRefreshが呼び出され、次のように設定に保存するだけです。

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

    sendRegistrationToServer(refreshedToken);
}

private void sendRegistrationToServer(String token) {
    // Add custom implementation, as needed.
    SharedPreferenceUtils.getInstance(this).setValue(getString(R.string.firebase_cloud_messaging_token), token);

   // To implement: Only if user is registered, i.e. UserId is available in preference, update token on server.
   int userId = SharedPreferenceUtils.getInstance(this).getIntValue(getString(R.string.user_id), 0);
   if(userId != 0){
       // Implement code to update registration token to server
   }
}

あなたが道で明確であることを願っています。さらにクリアランスが必要かどうかを尋ねます。

10
Chintan Soni

トークンはいつでも取得できます:

FirebaseInstanceID.getInstance().getToken();

これは、トークンがまだ生成されていない場合はnullを返し、生成されている場合はトークンを返します。あなたの場合、トークンはユーザーがサインインするまでに生成される可能性が非常に高いです。そのため、ユーザーがサインインするとすぐにトークンをアプリサーバーに送信できるはずです。 Chintan Soniが述べたように、onTokenRefreshコールバックで送信します。

14
Arthur Thompson

次のように処理しました。

  1. サーバーは、ユーザーID(主キー)に対してトークン値を作成/更新します
  2. 2つのSharedPreferences を使用します
    1. 文字列-トークン文字列
    2. ブール(更新)-トークンがサーバーで更新されるかどうか。

トークンの更新の場合、トークン文字列を更新し、ブール値をfalseに設定します。ブール値(更新済み)をチェックするたびにユーザーがログインするたびに、それがfalseの場合、現在のトークンを彼のIDに添付してサーバーに送信し、updatedをtrueに設定します。

6
Hisham Muneer