わかりましたので、最初の起動時にいくつかの歓迎スライドを案内し、ログイン/登録ページに移動し、MainActivity
に移動するアプリがあります。
FCM
を実装したばかりで、サービスはtoken
を生成しますbeforeこれらのページはユーザーに表示されています。サービスが実行されるようにするにはどうすればよいですかafterMainActivity
に到達しますか?
問題は、MySQL DB
に更新されるとすぐにトークンを適切なユーザーアカウントに送信しようとすることですが、ユーザーがまだサインインしていないため、null
サーバーへのメッセージが失敗します。これを設計する良い方法は何ですか?トークンをSharedPreferences
に保存し、ユーザーがログインした後にサーバーに送信することを考えましたが、トークンが後で更新されると多くの問題が発生しますか?!
可能な解決策:
2つのサービスがどのように実行されるかを完全に理解しているかはわかりませんが、onTokenRefresh
でトークンをSharedPreferences
に保存し、MainActivityでSP
から値を取得してからサーバーに送信します。その場合、トークンが更新されると、新しい値はすぐにSharedPreferences
に再び入ります。ただし、SPの新しい値であるかどうかを確認してから、サーバーに再アップロードする必要があります。これは混乱を招きます!
はい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
}
}
あなたが道で明確であることを願っています。さらにクリアランスが必要かどうかを尋ねます。
トークンはいつでも取得できます:
FirebaseInstanceID.getInstance().getToken();
これは、トークンがまだ生成されていない場合はnull
を返し、生成されている場合はトークンを返します。あなたの場合、トークンはユーザーがサインインするまでに生成される可能性が非常に高いです。そのため、ユーザーがサインインするとすぐにトークンをアプリサーバーに送信できるはずです。 Chintan Soniが述べたように、onTokenRefreshコールバックで送信します。
次のように処理しました。
トークンの更新の場合、トークン文字列を更新し、ブール値をfalseに設定します。ブール値(更新済み)をチェックするたびにユーザーがログインするたびに、それがfalseの場合、現在のトークンを彼のIDに添付してサーバーに送信し、updatedをtrueに設定します。