11
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【SwiftUI】FirebaseMessagingでプッシュ通知を実装する

Posted at

はじめに

プッシュ通知の実装は難しいものだと思ってずっと避けてきましたが、めっちゃ簡単だったので記事にしておきます。
古い記事を見るとめっちゃ複雑で難しそうなのですが、多分簡単になってます。
Firebaseにアプリは設定されている前提での記事になります。
まだ、以下のようなページがない場合は設定してください。
スクリーンショット 2023-02-28 22.01.12.png

APNs認証キーの作成

こちらから「Certificates, Identifiers & Profiles」を開きます。
① 「Keys」を選択します
② 「+」を選択します
スクリーンショット 2023-02-28 22.03.50.png

③ 「Key Name」を決めます(ここはなんでもいい)
④ 「Apple Push Notifications service (APNs)」にチェックを入れます
⑤ 「Continue」を選択します
スクリーンショット 2023-02-28 22.08.25.png

⑥ 「Register」を選択します
スクリーンショット 2023-02-28 22.11.42.png

⑦ 「Download」を選択します
スクリーンショット 2023-02-28 22.12.58.png

APNs認証キーのアップロード

① 設定マークを選択します
② 「プロジェクトの設定」を選択します
スクリーンショット 2023-02-28 22.22.45.png

③ 「Cloud Messaging」を選択します
スクリーンショット 2023-02-28 22.25.03.png

④ 「アップロード」を選択します
スクリーンショット 2023-02-28 22.26.31.png

⑤ ダウンロードしたファイルをドラッグします
⑥ キーIDを入力します(キーIDの場所は下で解説します)
⑦ チームIDを入力します(チームIDの場所は下で解説します)
スクリーンショット 2023-02-28 22.28.38.png

キーIDの場所
ここから先ほど作成したAPNs認証キーを選択してください
スクリーンショット 2023-02-28 22.34.11.png

チームIDの場所
ここから「メンバーシップの詳細」を確認します
スクリーンショット 2023-02-28 22.36.06.png

⑧ 「アップロード」を選択します
スクリーンショット 2023-02-28 22.39.01.png

実装

AppDelegate
import Firebase
import FirebaseCore
import FirebaseMessaging
import UserNotifications

final class AppDelegate: NSObject, UIApplicationDelegate {
    func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions _: [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()

        Messaging.messaging().token { token, error in
            if let error {
                print("Error fetching FCM registration token: \(error)")
            } else if let token {
                print("FCM registration token: \(token)")
            }
        }

        return true
    }

    func application(_: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
        print("Oh no! Failed to register for remote notifications with error \(error)")
    }

    func application(_: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        var readableToken = ""
        for index in 0 ..< deviceToken.count {
            readableToken += String(format: "%02.2hhx", deviceToken[index] as CVarArg)
        }
        print("Received an APNs device token: \(readableToken)")
    }
}

extension AppDelegate: MessagingDelegate {
    @objc func messaging(_: Messaging, didReceiveRegistrationToken fcmToken: String?) {
        print("Firebase token: \(String(describing: fcmToken))")
    }
}

extension AppDelegate: UNUserNotificationCenterDelegate {
    func userNotificationCenter(
        _: UNUserNotificationCenter,
        willPresent _: UNNotification,
        withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void
    ) {
        completionHandler([[.banner, .list, .sound]])
    }

    func userNotificationCenter(
        _: UNUserNotificationCenter,
        didReceive response: UNNotificationResponse,
        withCompletionHandler completionHandler: @escaping () -> Void
    ) {
        let userInfo = response.notification.request.content.userInfo
        NotificationCenter.default.post(
            name: Notification.Name("didReceiveRemoteNotification"),
            object: nil,
            userInfo: userInfo
        )
        completionHandler()
    }
}
SampleApp
import SwiftUI

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

通知を送る

① 「最初のキャンペーンを作成」を選択します
スクリーンショット 2023-02-28 22.46.33.png

② 「Firebase Notification メッセージ」を選択します
③ 「作成」を選択します
スクリーンショット 2023-02-28 22.47.31.png

④ 「通知のタイトル」を設定します
⑤ 「通知テキスト」を設定します
⑥ 「次へ」を選択します
スクリーンショット 2023-02-28 22.51.07.png

⑦ 対象のアプリを設定します
⑧ 「次へ」を選択します
スクリーンショット 2023-02-28 22.52.35.png

⑨ 「次へ」を選択します
スクリーンショット 2023-02-28 22.54.27.png

⑩ 「次へ」を選択します
スクリーンショット 2023-02-28 22.55.18.png

⑪ 「確認」を選択します
スクリーンショット 2023-02-28 22.55.57.png

⑫ 「公開」を選択します
スクリーンショット 2023-02-28 22.56.49.png

この画面になっていれば成功だと思います!
6分後に来たり、2分後に来たり結構アバウトな感じなのでちょっと待ってみましょう
アプリに通知が来たら成功です。
スクリーンショット 2023-02-28 22.57.36.png

おわり

こんなに簡単にプッシュ通知が実装できるなんて感動です
これが無料ってFirebaseやばくないですかね?

11
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?