【SwiftUI 開発RTA】Firebaseからリモートでプッシュ通知する

## 前提条件
- Xcodeセットアップ済み
- Apple Developer Program(有料)登録済み
- Google Firebase登録済み

# Xcodeでプロジェクトを作成する
1. Xcodeを起動する
1. Create New Project...
1. Multi Pratform > App > Next
1. Project Name: RemotePushSample(例) > Next
1. Source Control: チェック外す(任意) > Create
1. プロジェクトができる

# Remote Notificationを有効にする
1. RemotePushSample(TARGETS) > Signing & Capabilities
1. +Capabilityをクリック
1. Push Notificationsを選択
1. もう一度、+Capabilityをクリック
1. Background Modesを選択
1. Background ModesのRemote notificationsをチェックする
![スクリーンショット 2024-03-28 15.05.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518353/c6ad0f1c-e6cf-2309-1edf-93c87d1c15a3.png)

# Firebaseでプロジェクトを作成する
1. [Firebase](https://console.firebase.google.com)を開く
1. プロジェクトを追加
1. プロジェクト名：RemotePushSample(例) > 続行
1. アナリティクスのチェック外す(任意) > 続行
1. プロジェクトが作成されました > 続行
1. iOS+を選択
![スクリーンショット 2024-03-28 15.10.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518353/a1cecbb9-ffd1-1b27-9000-df4d0f988e6a.png)
1. AppleバンドルID: 以下で確認できる > アプリを登録
![スクリーンショット 2024-03-28 15.12.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518353/d4fe802c-1e34-733a-7e45-9f4959c1d7f0.png)
1. GoogleService-Info.plistをダウンロード
1. もう左上の×で閉じてOK

# Firebase SDKをインポートする
1. Xcodeに戻る
1. File > Add Package Dependencies...
1. 右上の検索欄に https://github.com/firebase/firebase-ios-sdk と入力
1. firebase-ios-sdkを選択 > Add Package
1. FirebaseMessagingのみ選択 > Add Package
1. RemotePushSampleフォルダを右クリック > Add Files to "RemotePushSample"...
![スクリーンショット 2024-03-28 15.44.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518353/29a2e22d-d45e-bfd0-c3c0-ef8752349e39.png)
1. ダウンロードしたGoogleService-Info.plistを選択 > Add
1. RemotePushSample(TARGETS) > Infoに以下を追加
・FirebaseAppDelegateProxyEnabled Boolean -> NO
 
# コーディング
```swift: RemotePushSampleApp.swift
import SwiftUI
import FirebaseCore
import FirebaseMessaging

class AppDelegate: NSObject, 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
    }
    
    // テスト通知に必要なFCMトークンを出力する
    func application(_ application: UIApplication,
                      didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        Messaging.messaging().apnsToken = deviceToken
        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)")
          }
        }
    }
}
extension AppDelegate: MessagingDelegate {}
extension AppDelegate: UNUserNotificationCenterDelegate {}

@main
struct RemotePushSampleApp: App {
    @UIApplicationDelegateAdaptor var delegate: AppDelegate
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}
```

# 実機で起動してFCMトークンを確認
1. 実機を選択してビルド→実行
1. 通知を許可しておく
1. 起動後、コンソールを見るとtokenが出力されているので控える
![スクリーンショット 2024-03-28 15.50.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518353/9f2cf96b-bd8f-b78a-6b82-429061ecae3f.png)

# APNs認証キーを作成する
1. [Apple Developer > Certificates, Identifiers & Profiles > Keys](https://developer.apple.com/account/resources/authkeys/list)
1. +ボタンをクリック
1. Key Name: RemotePushSample(例)
1. Apple Push Notifications service (APNs)をチェックする
![スクリーンショット 2024-03-28 16.11.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518353/ddb7b646-7c27-7dd3-a5ea-fce088b734aa.png)
1. Continue > Register
1. 認証ファイル(.p8)をダウンロードし、Key IDを控える
![スクリーンショット 2024-03-28 16.13.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518353/0b1669df-36d2-23a1-e97e-dd2ac0c99691.png)

# Firebaseに認証キーをアップロードする
1. 設定アイコン > プロジェクトの設定
![スクリーンショット 2024-03-28 16.06.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518353/080b81ce-3ec9-555a-855a-89e825df4f9c.png)
1. Cloud Messaging > Apple アプリの構成 > APNs 認証キーをアップロード
![スクリーンショット 2024-03-28 16.15.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518353/861a197b-5042-96b8-e6e8-99b6777e1f87.png)
1. APNs認証キー: ダウンロードした.p8ファイル
1. キーID: 認証キー作成時に控えたKey ID
1. チームID: [Apple Developer](https://developer.apple.com/account)で確認
![スクリーンショット 2024-03-28 16.21.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518353/23a7a5bc-3720-eba1-67cd-526cfbf8e34f.png)
1. アップロード

# Firebaseで通知を送信
1. 左のタブ > エンゲージメント > Messaging
![スクリーンショット 2024-03-28 16.25.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518353/c818a8de-5bf3-e6c1-e40a-c6546c6aa624.png)
1. 最初のキャンペーンを作成
1. Firebase Notification メッセージ > 作成
1. 通知のタイトル: テスト通知(例)
1. 通知テキスト: これはテストです。(例)
1. テストメッセージを送信
1. Xcodeのコンソールで控えたFCMトークンを入力 > + > テスト
1. テストデバイスに通知が送信されることを確認する
1. 次へ > ターゲット: アプリを選択する
1. 次へ > スケジュール設定: 現在
1. 次へ > 確認 > 公開
1. 数分後、通知が来る

終わり