web-dev-qa-db-ja.com

Firebaseのアプリトークンはどの期間に変更され、どのように管理するのですか?

私は、Firebaseを初めて使用し、幼児が歩くことを学ぶように学習しています。これまでのところ、firebaseフレームワークによって自分の電話用に生成されたトークンを使用して、自分の電話にメッセージを送信することができました。今、ここでトリッキーになります(私の意見では)。 FirebaseInstanceIdService拡張サービスには、onTokenRefresh()というメソッドがあります。 refreshと呼ばれるので、その後、変更されると想定しています。このトークンがいつ作成され、いつ変更されるのか知りたいですか?

そして、それが変更された場合、今のところオフラインであるトークン「A」を使用してデバイスにメッセージを送信し、キューに入れられると仮定します。これで、デバイスがオンラインになると、トークンが「B」に「更新」されます。これで、メッセージはトークン「A」に配信されるはずだったため、メッセージは配信されません。この状況をどのように管理できますか?

42
roostaamir

電話がGoogleサーバーに接続できるようになるとすぐに、アプリが最初に起動された後、トークンが生成されます。接続が必要なため、これはすぐには行われないかもしれませんが、ほとんどの場合、ユーザーがアプリを開いてから数秒後に行われます。トークンが生成されるとすぐに、メソッドonTokenRefresh()が呼び出されます。

指摘したように、トークンは変更される可能性があります。その場合、onTokenRefresh()メソッドが再度呼び出されます。
更新イベントはなんとなくまれです。頻繁に表示されるとは思わないでください。

更新トークンが発生すると、古いトークンに「正常に」送信されたすべてのメッセージ(APIからメッセージIDが返されます)が配信されます。

最後に、更新が発生した後でも、アプリが新しいトークンをバックエンドと通信できるように、古いトークンは短期間動作し続けます。

55
Diego Giorgini

アプリの初回起動時に、FCMのSDKはクライアントアプリインスタンスの登録トークンを生成します。上記のように、それはまれなイベントです。具体的には、登録トークンは次の場合に変更される場合があります。

  • アプリはインスタンスIDを削除します。
  • アプリは新しいデバイスに復元されます
  • ユーザーがアプリをアンインストール/再インストールする
  • ユーザーはアプリのデータを消去します。

インスタンスIDは、アプリのインスタンスごとに一意のIDを提供します。インスタンスIDは、サードパーティがアプリのサーバー側管理リソースにアクセスすることを許可するセキュリティトークンを生成するシンプルなAPIを提供します。インスタンスIDサーバーは、アプリがインストールされているデバイスこれを使用して、アプリからデータを保持するか、プッシュメッセージを送信してユーザーと再度エンゲージするかを決定できます。

デバイストークンが変更されるたびに、onTokenRefresh()メソッドに反映されます。変更時にデバイストークンを取得するには、このメソッドを呼び出します。更新されたトークンを取得します。

デバイストークンをいつでも取得するには、FirebaseInstanceId.getInstance()。getToken()メソッドを使用して現在のデバイストークンを取得します。デバイストークンを取得する時間。

こちら をクリックして、デバイス登録トークンへのアクセスの詳細をご覧ください。

23
Prakhar Anand
  • onTokenRefresh()およびFirebaseInstanceIdServiceは非推奨です。
  • この呼び出しも非推奨FirebaseInstanceId.getInstance()。getToken()

代わりにFirebaseMessagingServiceonNewToken(String token)をオーバーライドする必要があります。このメソッドは、トークンが変更されるとトリガーされます。このメソッドをオーバーライドすると、onciciRefresh()を含むFirebaseInstanceIdServiceを安全に削除できます。

トークンはいつ変更できますか?

  • アプリがインスタンスIDを削除する
  • アプリは新しいデバイスに復元されます
  • ユーザーがアプリをアンインストール/再インストールする
  • ユーザーがアプリのデータを消去する

現在のトークンを取得する方法:

firebaseInstanceId.getInstance()。getInstanceId()を呼び出すことにより:

FirebaseInstanceId.getInstance().getInstanceId()
    .addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() {
        @Override
        public void onComplete(@NonNull Task<InstanceIdResult> task) {
            if (!task.isSuccessful()) {
                Log.w(TAG, "getInstanceId failed", task.getException());
                return;
            }

            // Get new Instance ID token
            String token = task.getResult().getToken();

            // Log and toast
            String msg = getString(R.string.msg_token_fmt, token);
            Log.d(TAG, msg);
            Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
        }
    });

詳細: https://firebase.google.com/docs/cloud-messaging/Android/client

特定の送信者ID(デフォルトの送信者ID以外)のトークンを管理するには、 here をチェックします

1
Islam Assi