最近仕事で、FirebaseのFCM(Firebase Cloud Messaging)をiOSで実装したんですが、APNs認証キーを使ってプッシュ通知を実装するやり方に結構苦戦したので、記録として残しておきます。
APNs認証キーを使う新しいやり方
今までiOSでプッシュ通知を行う場合は、通知用の証明書を作成して、通知用サーバーに証明書をアップロードするやり方が主流でしたが、最近、APNs認証キーを使って実装する方法が追加されました。
APNs認証キーを使う方法であれば、有効期限がないので、証明書の更新を行う必要がないという点が一番のメリットですね。
参考:
Apple プラットフォームで Firebase Cloud Messaging クライアント アプリを設定する | Firebase Documentation
Apple Push Notification Authentication Keyを発行しよう | スマホアプリ制作・開発会社を東京都内でお探しなら【株式会社イーディーエー】
Firebase Cloud Messaging でpush通知をしていたのだが俺はもうダメかもしれない - あくまで個人的なメモ
APNs Provider APIとAPNs Auth Keyを使ったAPNs送信【毎年のAPNS証明書更新が不要に】 - Qiita
僕自身、プッシュ通知用の証明書を使った実装は何度か経験あったのですが、今回APNs認証キーを使ったやり方を試してみることにしました。
Firebaseのプッシュ通知の実装に関するドキュメントもちゃんとあったので、ちょっと違うけど大丈夫かと思ってました。
Apple プラットフォームで Firebase Cloud Messaging クライアント アプリを設定する | Firebase Documentation
Unity を使用して Firebase Cloud Messaging クライアント アプリを設定する | Firebase Documentation
しかし。。。
Firebaseコンソールからメッセージを送信しても一向に届かない。。。
APNs認証キーを使うところ以外は普通に今まで通りの実装をしてみたんですが、なぜかFirebaseコンソールからメッセージを送信しても通知が届きません。。。
FirebaseのUnityドキュメントを見直したら、「UserNotifications.framework」をXcodeのプロジェクトに追加する必要があるということで追加したのですが、結局届かず。。。。
とりあえず、僕が試したのは以下です。
・Apple DeveloperでAPNs認証キーを生成
・FirebaseコンソールでAPNs認証キーを登録
・FirebaseのSDKをUnityプロジェクトにインポート
・GoogleService-Info.plistをUnityプロジェクトに設置
・UnityプロジェクトでTokenReceivedとMessageReceivedのイベントハンドラを追加
・UnityでビルドしたiOSプロジェクトをXcodeで開いて「UserNotifications.framework」のフレームワークを追加
・GoogleService-Info.plistのTargetMembershipにチェックが入っていることを確認
・Xcodeのプロジェクトの「Push Notification」をONにする
・Xcodeのプロジェクトの「BackgroundModes」をONにする
・FirebaseAppDelegateProxyEnabledをNoにする
色々設定してみたんですが、結局通知が届きません。。。
「UnityのプラグインがAPNs認証キーに対応していない?」とか
「APNs認証キーを使うやり方でも最終的にプッシュ通知の証明書が必要なんじゃないか?」とか
色々考えたんですがわからず。。。
最終的に成功した例
で、さらに色々やった結果、最終的に成功したのか以下です。
・Apple DeveloperでAPNs認証キーを生成
・FirebaseコンソールでAPNs認証キーを登録
・FirebaseのSDKをUnityプロジェクトにインポート
・GoogleService-Info.plistをUnityプロジェクトに設置
・UnityプロジェクトでTokenReceivedとMessageReceivedのイベントハンドラを追加
・UnityでビルドしたiOSプロジェクトをXcodeで開いて「UserNotifications.framework」のフレームワークを追加
・GoogleService-Info.plistのTargetMembershipにチェックが入っていることを確認
・Xcodeのプロジェクトの「Push Notification」をONにする
変更点は、
・FirebaseAppDelegateProxyEnabledをNoにする
・Xcodeのプロジェクトの「BackgroundModes」をONにする
上記をやめたのと、TokenReceivedとMessageReceivedのイベントハンドラの部分の実装を修正しました。
ここの部分の実装は、FirebaseのUnity向けクイックスターのサンプルを流用したものです。
どれが原因だったかはまだ判断ついてませんが、おそらくイベントハンドラの実装部分が原因だったんじゃないかと思います。
とりあえず無事プッシュ通知が届くようになってよかったです。
初めてプッシュ通知を実装した時にも感じたことなんですが、いくら送っても全然届かなかったプッシュ通知がようやく来た時の感動はやばいです!
一時はUnityやAPNs認証キーのせいだ!とか思ってたんですが、結局自分の実装が間違っていただけっぽいです。。
いやー、粘ってよかった。。。
関連:
【iOS】プッシュ通知(Firebase Cloud Messaging)で「エンタイトルメント文字列が見つかりません」のエラーの対処法 - AppSeedのアプリ開発ブログ
【Unity】Androidのプッシュ通知でアイコンが白くなる問題の対処法 - AppSeedのアプリ開発ブログ