はじめに
基本的な実装方法・証明書周りの設定方法は日本語の記事も多いのでそちらをご覧ください。
https://firebase.google.com/docs/cloud-messaging/ios/client?hl=ja
今回は SwiftUI でプロジェクトを作成した場合、つまり AppDelegate
を後から追加した場合の注意点をご紹介します。
結論
FCM SDK は deviceToken を取得する処理の実装を Method Swizzling を利用して実現しています。ただし、これが正常に動作するのは AppDelegate
を @main
として利用している場合に限ります。
なので、 SDK の Method Swizzling に頼らず、以下の処理を明示的に記述する必要があります。
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
Messaging.messaging().apnsToken = deviceToken
}
詳細
SwiftUI をベースにプロジェクトを作成した場合、以下のような形で AppDelegate
を実装することになります。
この場合、 FCM SDK による Method Swizzling が AppDelegate
に対して走らないため、開発者側で明示的に追記してあげる必要があります(ここの挙動は細かく調べたわけではないので、間違いがあればご指摘お願いします)
@main
struct MyApp: App {
@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
var body: some Scene {
WindowGroup {
...
}
}
}
final class AppDelegate: UIResponder, UIApplicationDelegate {
typealias LaunchOptionsKey = UIApplication.LaunchOptionsKey
func application(_ application: UIApplication, didFinishLaunchingWithOptions: [LaunchOptionsKey: Any]? = nil) -> Bool {
return true
}
}
詳しくはここに記述されています。
実装入れ替えが無効な場合の APNs トークンと登録トークンとのマッピング
さいごに
結論として、公式ドキュメントにもしっかり書かれている内容だったということになりますが、 SwiftUI メインでアプリを開発する場合は特に注意したほうがいいかと思い、記事として残してみました。
公式ドキュメント・SDK ともに後々仕様が変わる可能性がありますので、まずは最新の情報を確認した上でこの記事も参考にしていただければと思います。
最後まで読んでいただき、ありがとうございます!