2016-07-12 16 views
12

さて、私は最初のスタートでいくつかの歓迎スライドをあなたに連れて行くアプリケーションを持っています、そして、あなたはログイン/登録ページに行き、次にMainActivityに行きます。Firebase FCMトークン - サーバーに送信するタイミング

は、私はちょうどFCMを実装しているとサービスは、これらのページのいずれかがユーザーによって見られている前tokenを生成します。サービスを実行するにはどうすればの後にMainActivityになるのですか?

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

解決策

私は、私は完全に2つのサービスの実行方法理解していないが、私はちょうどSharedPreferencesにトークンを保存し、MainActivityに私はSPから値を取得し、私が送っonTokenRefreshで言いますそれをサーバーに送信します。その場合、トークンがリフレッシュされると、新しい値は直ちにSharedPreferencesに再び入ります。しかし、私はそれがSPの新しい値であるかどうかを確認し、それをサーバーに再アップロードする必要があります。これは混乱しています!

+0

http://engineering.letsnurture.com/firebase-cloud-messaging/ –

答えて

8

あり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 
    } 
} 

あなたが途中でクリアされている願っています。それ以上のクリアランスが必要かどうか質問してください。

+0

私は同じことができるだけでなく、アプリケーションを使用する唯一の方法は、登録することですので、最初の起動時に私のMainActivityでサーバーにトークンを送信するサービスが最初に起動したときにユーザIDがないので、サーバに送信されません。私はそれが私の解決だと思う。トークンを初めて取得したときにサーバーに送信しないでください。あるいは、あとでやっても、コードを入れなかったのですか? – iBobb

5

我々はこのようにそれを扱わ:

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

リフレッシュトークンのケースでは、トークン文字列を更新し、falseにブール値を設定します。 ブール値(更新)をチェックするたびにユーザがログインするたびに、それが偽であれば、現在のトークンを自分のIDに添付してサーバに送信し、trueを更新します。あなたはいつもとトークンを取得することができます

+1

には、ユーザーの電子メールを使ってトークンを取得する方法があります(すべてサーバー側)。 – Andrea

11

注:それが生成されている場合は、トークンがまだ生成またはトークンされていない場合、これはnullを返します

FirebaseInstanceID.getInstance().getToken(); 

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

関連する問題