🏎️

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

3 min read

どうしてもデバイストークンをリセットしたい場面があったのでメモです。
同じことをやろうとしている情報はネットに転がっていたのですが、情報が古く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...
}

deprecatedとなった、FirebaseInstanceIdクラスを用いている場合はFirebaseInstanceId#deleteToken()ではなく、deleteInstanceId()メソッドを使う必要があるという情報がありました。またdeleteinstanceId()メソッドの注釈で
This method is deprecated. Use FirebaseInstallations.delete() and FirebaseMessaging.deleteToken() instead.
という記載があったため、はじめはFirebaseMessaging.getInstance().deleteToken()に加えて、FirebaseInstallations.delete()を呼び出した上でトークンを再取得していました。(こちらでもうまくリセットできる)しかし試してみたところ、上の通り削除と取得を順に呼ぶだけでも期待通りの挙動になったためこちらで記載しております。正直どちらが良いのかわかっていないため、知見のある方いらっしゃったらコメント頂けると嬉しいです:_(

届くかテスト

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