🔔

【Swift】Firebaseからプッシュ通知を受け取るために最低限の実装をする(iOS15対応)

2022/05/01に公開

はじめに

iOS端末でFirebase(Firebase Cloud Messaging)からプッシュ通知を受信するため、できるだけコンパクトな実装をしてみました。
SwiftUIを使ってます。
※証明書周りの準備やFirebaseの設定は、わかりやすい記事があるので基本的にはそちらを紹介します。

環境

Swift5
Xcode13.3
iOS15

手順

証明書の準備

以下記事に沿って1-6の項目を進めてください。
https://qiita.com/natsumo/items/d5cc1d0be427ca3af1cb
項目7のp12ファイルは用意する必要ありません。
Firebase Cloud Messagingでもp8ファイルが推奨されているため、p12ファイルではなく次項における説明(記事を紹介)に則ってp8ファイルを作ってそれを設定する方が良いかと思います。

p8ファイルの準備、Firebaseに設定

FirebaseでiOS用のアプリを準備しておいてください。
(GoogleService-Info.plistをアプリに追加も忘れないようにしてください。)
その後、以下の記事に沿ってp8ファイルを用意しFirebaseに設定します。
https://qiita.com/matsuyoro/items/77408e5d09ef00be8577

アプリ側の設定

  1. TARGETS -> Signing & Capabilities
  2. Automatically manage signingのチェックを外す
  3. 証明書の準備で用意したBundle IdentifierとProvisioning Profileを設定
  4. TARGETS -> Signing & Capabilities の+ボタンから「Push Notifications」を追加

コードを実装

CocoaPodsを使って必要なライブラリをインストールします。

pod 'Firebase/Messaging'

AppDelegateクラスでプッシュ通知を受け取るための実装をします。

// xxxApp.swift

import SwiftUI
import Firebase
import FirebaseMessaging

class AppDelegate: UIResponder, UIApplicationDelegate {
    func application(_ application: UIApplication,
                     didFinishLaunchingWithOptions
                     launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil) -> Bool {
        FirebaseApp.configure()
        Messaging.messaging().delegate = self
        UNUserNotificationCenter.current().delegate = self

        // 初回起動時、プッシュ通知の許可ダイアログを表示させる
	let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
        UNUserNotificationCenter.current().requestAuthorization(
        options: authOptions,
        completionHandler: { _, _ in }
        )
	
        application.registerForRemoteNotifications()

        return true
    }
}

extension AppDelegate: MessagingDelegate {}

extension AppDelegate: UNUserNotificationCenterDelegate {
    // アプリがフォアグラウンドでプッシュ通知を受信した場合に呼ばれる
    func userNotificationCenter(_ center: UNUserNotificationCenter,
                                willPresent notification: UNNotification,
                                withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        let userInfo = notification.request.content.userInfo
        print(userInfo)
        completionHandler([.banner, .badge, .sound])
    }

    // 通知センター等でプッシュ通知をタップした場合に呼ばれる
    func userNotificationCenter(_ center: UNUserNotificationCenter,
                                didReceive response: UNNotificationResponse,
                                withCompletionHandler completionHandler: @escaping () -> Void) {
        let userInfo = response.notification.request.content.userInfo
        print(userInfo)
        completionHandler()
    }
}

@main
struct xxxApp: App {
    @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

テスト通知を行う

証明書の準備で登録した端末で実機ビルドを行い、FirebaseコンソールのMessagingからテスト通知を送信し、端末で無事に受信できたら成功です。

参考

https://firebase.google.com/docs/cloud-messaging/ios/client?hl=ja
https://developer.apple.com/documentation/usernotifications/unusernotificationcenterdelegate/1649518-usernotificationcenter
https://developer.apple.com/documentation/usernotifications/unusernotificationcenterdelegate/1649501-usernotificationcenter
https://blog.mbaas.nifcloud.com/entry/2020/04/14/095614
https://qiita.com/uhooi/items/7e7f0293a83b57eaf72f

Discussion