現状の問題
- Androidエミュレータだと通知がくる
- iPhoneの実機やシミュレータだとpush通知が届かない
- どちらもFCMトークンは取得できてる(ログ出力で確認済)
確認したこと
- アプリで取得したFCMトークンを使用してFirebaseから直接push通知を送ってみたが、通知が来ない
- ログ確認
- FCMトークンが取得されているかの確認
- APNSトークンが取得できているか
- FirebaseとXcodeのBundleIDが一致しているか
- FirebaseにAPNsトークンが設定されているか
わかったこと
APNsトークンとは
iOSデバイス専用の「Push通知の宛先住所」
AppleのPush通知サーバーが、「特定のiOSデバイス」の「特定のアプリ」に対して発行する、一意のIDのこと
APNsトークンとFCMトークンの紐付けの流れ
-
【APNsトークンの取得】
アプリ(Firebase SDK)は、まずiOSに対して「通知の許可」を求め、AppleからネイティブのAPNsトークンを取得する。 -
【トークンの交換】
その取得したAPNsトークンをFCMサーバーに送信し、FCMトークンを発行する -
【通知の送信】
これによってiOS・Androidを区別せず、FCMトークンを使ってFCMサーバーに通知を送信する。 -
【FCMからAPNsへの転送】
FCMサーバーは、受け取ったFCMトークンがiOSデバイスのものであることを認識すると、紐付けられたAPNsトークンを探し出して、通知内容をAPNsが要求する形式に変換してAPNsサーバーに転送する。 -
【APNsからデバイスへの通知】
最終的に、APNsがデバイスに通知を届けます。
Android と iOS のバックグラウンド通知処理の違い
- Android:
- FCM サーバー → Google Play Services → システム通知表示
- バックグラウンド通知は Google Play Services が自動処理
- iOS:
- APNs サーバー → iOS システム → アプリのバックグラウンドハンドラー
- バックグラウンド処理は手動設定が必須
BundleIDとは
- そのアプリを一意に識別するためのID。
- 逆ドメイン型が主流
解決
Firebaseに本番用のAPNs認証キーは設定してあったが、開発用APNs認証キーの設定がされてなかったことが原因
参考にしたサイト