私は、Firebaseを初めて使用し、幼児が歩くことを学ぶように学習しています。これまでのところ、firebaseフレームワークによって自分の電話用に生成されたトークンを使用して、自分の電話にメッセージを送信することができました。今、ここでトリッキーになります(私の意見では)。 FirebaseInstanceIdService
拡張サービスには、onTokenRefresh()
というメソッドがあります。 refreshと呼ばれるので、その後、変更されると想定しています。このトークンがいつ作成され、いつ変更されるのか知りたいですか?
そして、それが変更された場合、今のところオフラインであるトークン「A」を使用してデバイスにメッセージを送信し、キューに入れられると仮定します。これで、デバイスがオンラインになると、トークンが「B」に「更新」されます。これで、メッセージはトークン「A」に配信されるはずだったため、メッセージは配信されません。この状況をどのように管理できますか?
電話がGoogleサーバーに接続できるようになるとすぐに、アプリが最初に起動された後、トークンが生成されます。接続が必要なため、これはすぐには行われないかもしれませんが、ほとんどの場合、ユーザーがアプリを開いてから数秒後に行われます。トークンが生成されるとすぐに、メソッドonTokenRefresh()
が呼び出されます。
指摘したように、トークンは変更される可能性があります。その場合、onTokenRefresh()
メソッドが再度呼び出されます。
更新イベントはなんとなくまれです。頻繁に表示されるとは思わないでください。
更新トークンが発生すると、古いトークンに「正常に」送信されたすべてのメッセージ(APIからメッセージIDが返されます)が配信されます。
最後に、更新が発生した後でも、アプリが新しいトークンをバックエンドと通信できるように、古いトークンは短期間動作し続けます。
アプリの初回起動時に、FCMのSDKはクライアントアプリインスタンスの登録トークンを生成します。上記のように、それはまれなイベントです。具体的には、登録トークンは次の場合に変更される場合があります。
インスタンスIDは、アプリのインスタンスごとに一意のIDを提供します。インスタンスIDは、サードパーティがアプリのサーバー側管理リソースにアクセスすることを許可するセキュリティトークンを生成するシンプルなAPIを提供します。インスタンスIDサーバーは、アプリがインストールされているデバイスこれを使用して、アプリからデータを保持するか、プッシュメッセージを送信してユーザーと再度エンゲージするかを決定できます。
デバイストークンが変更されるたびに、onTokenRefresh()メソッドに反映されます。変更時にデバイストークンを取得するには、このメソッドを呼び出します。更新されたトークンを取得します。
デバイストークンをいつでも取得するには、FirebaseInstanceId.getInstance()。getToken()メソッドを使用して現在のデバイストークンを取得します。デバイストークンを取得する時間。
こちら をクリックして、デバイス登録トークンへのアクセスの詳細をご覧ください。
代わりに、FirebaseMessagingServiceでonNewToken(String token)をオーバーライドする必要があります。このメソッドは、トークンが変更されるとトリガーされます。このメソッドをオーバーライドすると、onciciRefresh()を含むFirebaseInstanceIdServiceを安全に削除できます。
トークンはいつ変更できますか?
現在のトークンを取得する方法:
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 をチェックします