アプリ未起動状態からのプッシュ通知のログを確認する

## やりたいこと
プッシュ通知について
・フォアグラウンド
・バックグラウンド
・未起動
の内、**未起動状態**からのログを確認したい。

## 使用するもの
- OSLog
- コンソール.app
- 実機端末（シミュレーターでもOK？）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245300/62bc0084-0872-918f-a90d-545f18b704aa.png)

## OSLog
```OSLog+Ext.swift
import os

extension OSLog {
    /// Console.appで"サブシステム"の【FCM】でフィルタリングするとログを確認できる
    static let fcmConsole = Logger(subsystem: "【FCM】", category: "Console")
}
```

```AppDelegate.swift
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil) -> Bool {
    OSLog.fcmConsole.debug("【start】didFinishLaunchingWithOptions")
    OSLog.fcmConsole.debug("launchOptions = \(String(describing: launchOptions))")
```

## コンソール.app
- Macアプリ一覧からコンソールアプリを起動
- 対象デバイスを選択
- 画面右上のフィルターでサブシステムの【FCM】で絞り込み

![スクリーンショット 2023-10-11 10.38.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245300/03274ae6-0dd3-dab7-896b-e55e448cabd5.png)

課題：
- launchOptionsのログが`<private>`となって閲覧できていない
- 多分FCM通知は今はdidFinishLaunchingWithOptionsでは取れない

## launchOptionsのログが`<private>`となって閲覧できない件の対応
Loggerのデフォルトが.privateになっているようなので、.publicで指定する。
```
OSLog.fcmConsole.debug("launchOptions = \(String(describing: launchOptions), privacy: .public)")
```

## 多分FCM通知は今はdidFinishLaunchingWithOptionsでは取れないの対応
UNUserNotificationCenterDelegateを使う


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

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

プッシュ通知をタップしてアプリ起動する
![スクリーンショット 2023-10-11 11.22.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245300/a684c2b7-4aca-dfc2-5127-c9a3c1da0fc4.png)
これでログを取得できるようになった。

## Console.appについてのトラブルシューティング
- ログが出力されないとき
    - MAC-iPhoneをケーブルで接続する
    - 同一のWi-Fiに接続する
    - Console.appを再起動する
- ログが重複して出力されるとき
    - Console.appを再起動する

## 参考
- [OSLogを利用したロギング](https://scior.hatenablog.com/entry/2021/03/07/183542)
- [iOS14から登場したNew Logger API vs OSLog - ログメッセージの可視性](https://qiita.com/Nick_paper/items/3a6f7d41bc80773b90bf#%E3%83%AD%E3%82%B0%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%81%AE%E5%8F%AF%E8%A6%96%E6%80%A7)
- [【Swift】Firebaseからプッシュ通知を受け取るために最低限の実装をする(iOS15対応)](https://zenn.dev/tomsan96/articles/0cdfde2a49bfb2)