🏎️

Firebaseのデバイストークンを強制的にリセットする方法

2021/06/17に公開

どうしてもデバイストークンをリセットしたい場面があったのでメモです。
同じことをやろうとしている情報はネットに転がっていたのですが、情報が古くdeprecatedなメソッドを使ったものだったので混乱しました。執筆時点(2021/06/16)ではこのやり方でリセットできます。

トークンが生成されたタイミングで呼び出されるメソッド

デバイストークンを活用してプッシュ通知を送りたい場合、FirebaseMessagingService()を継承したクラスのonNewToken()内で何かしらのサーバー側へトークンの設定処理を実装するのが一般的だと思います。

MyFirebaseService.kt
class MyFirebaseMessagingService : FirebaseMessagingService() {
    override fun onNewToken(token: String) {
    // ここでトークンの設定処理を実行する。
    }
}

公式ドキュメントによればonNewToken()の呼ばれるタイミングは

This is invoked after app install when a token is first generated, and again if the token changes.

です。
リセットするためにonNewToken()を強制的に呼び出す方法があればよかったのですが、どうやらなさそうなので、デバイストークンの削除と取得処理を実装します。

デバイストークンの削除と再取得

FirebaseMessaging.getInstance().deleteToken()でトークンを削除した後に、FirebaseMessaging.getInstance().getToken()をもう一度呼び出すと新しいデバイストークンを呼び出すことができます。(org.jetbrains.kotlinx:kotlinx-coroutines-play-servicesを使用しています。)

MainActivity.kt
val firebaseMessaging = FirebaseMessaging.getInstance()
GlobalScope.launch {
    val exToken = firebaseMessaging.token.await()
    Timber.e("Token_ex:$exToken") //Token_ex:dP5qQdyNSyylMRKeUxbKzl:APA91bHWiNwGmP2q3WI7i...
    firebaseMessaging.deleteToken().await()
    val cuToken = firebaseMessaging.token.await()
    Timber.e("Token_cu:$cuToken") //Token_cu:dP5qQdyNSyylMRKeUxbKzl:APA91bH7ZhECdyhiwodga...
}

届くかテスト

FirebaseコンソールのNotificationComposeを使用します。
CloudMessaging -> テストメッセージを送信を選択すると指定したトークン宛にメッセージを送ることができます。

プッシュ通知が、削除されたトークン宛には届かず、再取得後のトークン宛には届くことを確認できました。

ドキュメント

https://firebase.google.com/docs/cloud-messaging/android/client?hl=ja
https://firebase.google.com/docs/reference/android/com/google/firebase/messaging/FirebaseMessaging
https://firebase.google.com/docs/reference/android/com/google/firebase/messaging/FirebaseMessagingService
https://firebase.google.com/docs/reference/android/com/google/firebase/installations/FirebaseInstallations

https://firebase.google.com/docs/reference/android/com/google/firebase/iid/FirebaseInstanceId

Discussion