😽

FirebaseでのPush通知がiOS端末に届かない

2021/02/19に公開

Unityで開発を行っております。

Firebaseを使用してPush通知を行おうとしているのですが、iOS端末に通知が届きません。
FirebaseへはAPNs 証明書を作成して登録しております。
APNs 認証キーは登録しておりません。

環境は
Unity:2018.4.22f1

Firebase SDKは
Firebase App(Core) Ver7.10
Firebase Authentication Ver7.10
Firebase Cloud Messaging Ver7.10
Google Analytics for Firebase Ver7.10

をインストールしております。

端末は
iPad(第7世代)
iOS 14.4
になります。

Xcodeでビルドする際に
Push Notificationsの追加
BackgroundModesを追加しRemote notificationsにチェック
の設定を行っております。

以前Push通知が出来ていたソースコードも用いて対応しているのですが
通知が受信できなく、原因がわかっておりません。
イベントハンドラ実装部分は以下のコードで行っております。

public class FirebaseMessaging : MonoBehaviour
{
Firebase.DependencyStatus dependencyStatus = Firebase.DependencyStatus.UnavailableOther;
private string topic = "TestTopic";
private string topicSubscribe = "/topics/nbb_topic";

// 指定されたタスクの結果をログに記録し、タスクがtrueの場合はtrueを返します。
protected bool LogTaskCompletion(Task task, string operation)
{
bool complete = false;

if( task.IsCanceled )
{
Debug.Log( "LogTaskCompletion()::"+operation + " canceled." );
}
else
if( task.IsFaulted )
{
Debug.Log( "LogTaskCompletion()::"+operation + " encounted an error." );
foreach( Exception exception in task.Exception.Flatten().InnerExceptions ){
string errorCode = "";
Firebase.FirebaseException firebaseEx = exception as Firebase.FirebaseException;
if( firebaseEx != null ){
errorCode = String.Format( "LogTaskCompletion()::"+"Error.{0}: ", ((Firebase.Messaging.Error)firebaseEx.ErrorCode).ToString() );
}
Debug.Log( "LogTaskCompletion()::"+errorCode + exception.ToString() );
}
}
else
if( task.IsCompleted )
{
Debug.Log( "LogTaskCompletion()::"+operation + " completed" );
complete = true;
}
return complete;
}

protected virtual void Start()
{
Firebase.Messaging.FirebaseMessaging.TokenReceived += OnTokenReceived;
Firebase.Messaging.FirebaseMessaging.MessageReceived += OnMessageReceived;
Firebase.Messaging.FirebaseMessaging.Subscribe( topicSubscribe );

Firebase.FirebaseApp.CheckAndFixDependenciesAsync().ContinueWith( task => {
dependencyStatus = task.Result;
if( dependencyStatus == Firebase.DependencyStatus.Available ){
InitializeFirebase();
}else{
Debug.Log( "FwFirebaseMessaging()::Could not resolve all Firebase dependencies: " + dependencyStatus );
}
});
}

// メッセージイベントハンドラをセットアップします。
void InitializeFirebase()
{
// アプリが通知を表示する権限を要求しないようにする
// 初期化されると直ちに。 プロンプトが表示されているので
// 非表示にするには、
// RequestPermission()は別の場所にあります。
//Firebase.Messaging.FirebaseMessaging.TokenRegistrationOnInitEnabled = false;
Firebase.Messaging.FirebaseMessaging.TokenRegistrationOnInitEnabled = true;
Firebase.Messaging.FirebaseMessaging.SubscribeAsync(topic).ContinueWith(task => {
LogTaskCompletion( task, "SubscribeAsync" );
});
Debug.Log("FwFirebaseMessaging()::Firebase Messaging Initialized");

// これにより、受信許可を求めるプロンプトが表示されます
// 前にプロンプトが表示されていない場合は通知。 (If
// ユーザーはすでにプロンプトに応答し、その決定は
// OSはOSの設定で変更できます)。
Firebase.Messaging.FirebaseMessaging.RequestPermissionAsync().ContinueWith(task => {
LogTaskCompletion( task, "RequestPermissionAsync" );
});
}

public virtual void OnMessageReceived(object sender, Firebase.Messaging.MessageReceivedEventArgs e)
{
Debug.Log("OnMessageReceived()::Received a new message");
var notification = e.Message.Notification;
if (notification != null) {
Debug.Log("OnMessageReceived()::title: " + notification.Title);
Debug.Log("OnMessageReceived()::body: " + notification.Body);
}
if (e.Message.From.Length > 0)
Debug.Log("OnMessageReceived()::from: " + e.Message.From);
if (e.Message.Link != null) {
Debug.Log("OnMessageReceived()::link: " + e.Message.Link.ToString());
}
if (e.Message.Data.Count > 0) {
Debug.Log("data:");
foreach (System.Collections.Generic.KeyValuePair<string, string> iter in e.Message.Data){
Debug.Log("OnMessageReceived()::iter.Key: " + iter.Key + ": " + iter.Value);
}
}
}

public virtual void OnTokenReceived( object sender, Firebase.Messaging.TokenReceivedEventArgs token )
{
// トークンの取得
Debug.Log("OnTokenReceived()::Received Registration Token: " + token.Token);
}
}

何か基本的な設定を抜かしていたり、実装方法で間違った点などご指摘いただければと思います。
よろしくお願い致します。

Discussion