TL;DR
FirebaseMessaging.GetTokenAsync() で現在のトークンを取得するようにしよう!
事のいきさつ
Unityを使ったプロダクトでFirebaseUnitySDKを利用していたのですが、CloudMessagingを利用する際、
Android端末でのみPushTokenが受け取れない事がある という事象が起きていました。
調査の結果、アプリの初回起動時のみTokenを受信出来ていてそれ以降はアプリを入れ直すまで受信しないという状態になっていました。
iOSでは毎回来ていたので開発中に不具合の検知が遅れてしまいました。
その時の実装イメージ
FirebaseProvider.cs
public FirebaseProvider()
{
FirebaseApp.CheckAndFixDependenciesAsync().ContinueWith(task =>
{
var dependencyStatus = task.Result;
if (dependencyStatus == DependencyStatus.Available) {
// Create and hold a reference to your FirebaseApp,
// where app is a Firebase.FirebaseApp property of your application class.
AppInstance = FirebaseApp.DefaultInstance;
// Set a flag here to indicate whether Firebase is ready to use by your app.
FirebaseMessaging.TokenReceived += FirebaseMessagingOnTokenReceived;
FirebaseMessaging.MessageReceived += FirebaseMessagingOnMessageReceived;
} else {
Debug.LogError("Firebase Initialize Failed.");
}
});
}
private void FirebaseMessagingOnMessageReceived(object sender, MessageReceivedEventArgs e)
{
}
private void FirebaseMessagingOnTokenReceived(object sender, TokenReceivedEventArgs e)
{
//ここでPushTokenを受け取ってサーバーに渡してた
}
解決策
GetTokenAsyncを使おう
https://firebase.google.com/docs/reference/unity/class/firebase/messaging/firebase-messaging#gettokenasync
このメソッドをコールすることで現在のトークンを取得することができます。
このトークンを使うことで解決しました
その後の実装例
FirebaseProvider.cs
//このメソッドを叩いてTokenを取得し、サーバーに送る
public async UniTask<string> GetFcmTokenAsync(CancellationToken cancellationToken)
{
string ret = string.Empty;
if (AppInstance != null)
{
cancellationToken.ThrowIfCancellationRequested();
ret = await FirebaseMessaging.GetTokenAsync();
cancellationToken.ThrowIfCancellationRequested();
}
Debug.Log($"Firebase PushToken {ret}");
return ret;
}