【Flutter】Firebase Messagingを使ったiOSプッシュ通知の実装手順
はじめに:開発しているアプリ「おうちログ」について
この記事では、私が開発している**家族やパートナーのための共有アプリ「おうちログ」**に、FlutterとFirebase Cloud Messaging (FCM) を使ってiOSのプッシュ通知機能を実装した際の、具体的な設定手順と、その確認方法をまとめます。
おうちログ - App Store
Androidでは比較的スムーズに実装できましたが、iOSでは特有の設定が多く必要でした。ここではその手順をシンプルに紹介します。
1. Apple Developerサイトでの設定
FirebaseからAPNs(Apple Push Notification service)経由で通知を送るための認証キーを設定します。
-
APNs認証キーの作成
- Apple Developerサイトにログインし、「Certificates, Identifiers & Profiles」へ移動
- 「Keys」セクションで「+」を押し、キーを作成
- 「Apple Push Notifications service (APNs)」にチェックを入れる
- 作成した認証キー(
.p8ファイル)をダウンロードする (一度しかダウンロードできないので注意) - 「キーID」と「チームID」を控えておく
-
Firebaseへのキー登録
- Firebaseコンソールのプロジェクト設定 > 「クラウドメッセージング」タブを開く
- 「Appleアプリの構成」で、ダウンロードした
.p8ファイルと、控えておいたキーID、チームIDを登録する
2. Xcodeプロジェクトでの設定
アプリがプッシュ通知を受け取れるように、Xcodeで権限を有効化します。
-
ios/Runner.xcworkspaceをXcodeで開く -
Runner> 「Signing & Capabilities」タブを開く -
Capabilityの追加
- 「+ Capability」をクリックし、「Push Notifications」を追加する
- もう一度「+ Capability」をクリックし、「Background Modes」を追加する
- 追加された「Background Modes」の中から、「Remote notifications」にチェックを入れる
3. 実装の確認方法
上記の設定が完了したら、実際に通知が届くかテストします。(※ iOSシミュレータはプッシュ通知に対応していないため、必ず実機でテストしてください)
-
FCM登録トークンの取得
- Xcodeで、実機をターゲットにしてアプリを実行します。
- 実行後、XcodeのコンソールログにFCM登録トークンが出力されます。このトークンはテストに必要なのでコピーしておきます。
もしトークンが見つからない場合は、
AppDelegate.swiftのdidRegisterForRemoteNotificationsWithDeviceTokenメソッド内に以下のコードを追加すると、FCMトークンを確実に取得・表示できます。// APNsへの登録が成功した場合 override func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { Messaging.messaging().apnsToken = deviceToken // FCMトークンを取得してコンソールに出力 Messaging.messaging().token { token, error in if let error = error { print("❌ Error fetching FCM registration token: \(error)") } else if let token = token { print("✅ FCM registration token: \(token)") } } } -
Firebaseコンソールからテスト通知を送信
- Firebaseコンソールの左側メニューから「エンゲージメント」>「Messaging」を選択します。
- 「最初のキャンペーンを作成」または「新しいキャンペーン」をクリックし、「通知」を選択します。
- 通知のタイトルと本文を適当に入力し、「テストメッセージを送信」をクリックします。
- 「FCM登録トークンを追加」の欄に、先ほどコピーしたデバイスのFCMトークンを貼り付けます。
- 「テスト」ボタンをクリックします。
実機のアプリに通知が届けば、設定は成功です!