unagirabbit's blog

気づいたことをメモしています

【Firebase】AndroidだとTokenReceivedが呼ばれないことがある

FCMで個別端末への通知を行うにはトークンを取得する必要があります。
このトークンはFCM初期化後のTokenReceivedで受け取るのですが、
8.0.0以降のバージョンでは2回目以降の起動時にTokenReceivedが呼ばれないことがあります。
Androidでのみ再現し、機種や環境などが原因ではなく稀に発生するようです。

このバグは10.7.0でも修正されていません。

github.com

対策

https://github.com/firebase/quickstart-unity/issues/1088#issuecomment-1191030814

同スレッドで対策方法が紹介されています。
FirebaseMessaging.TokenReceivedのデリゲートで受け取らず、
FirebaseMessaging.GetTokenAsync()トークンを取得します。

public async void InitFirebase()
{
    try {
        var dependencyStatus = await Firebase.FirebaseApp.CheckAndFixDependenciesAsync();
        if (Firebase.DependencyStatus.Available != dependencyStatus) {
            // error.
            return;
        }
#if UNITY_IOS
        // iOSは問題ない
        Firebase.Messaging.FirebaseMessaging.TokenReceived += OnTokenReceived;
#else
        // Androidは手動で取得
        Firebase.Messaging.FirebaseMessaging.MessageReceived += OnMessageReceived;
        var token = await Firebase.Messaging.FirebaseMessaging.GetTokenAsync();
        // register token.
#endif
    } catch (Firebase.FirebaseException) {
        // error.
    } catch (System.Exception) {
        // error.
    }
}

asyncを使用せずメインスレッドで処理したい場合はContinueWithOnMainThreadを使います。

// using Firebase.Extensionsが必要
Firebase.Messaging.FirebaseMessaging.GetTokenAsync().ContinueWithOnMainThread(task => {
    if(true == task.IsCompletedSuccessfully) {
        // register token.
    }
});