【Swift5】プッシュ通知からアプリを起動して処理したい場合

ログイン後だったり、画面が完全に構築されてからプッシュ通知のデータを扱いたい場合、
NotificationQueue を使うと安定するのでメモしやす。
まずは挙動が掴めるよう簡単なコードを。

private let noticeName = NSNotification.Name(rawValue: "notice")

override func viewDidLoad() {
    super.viewDidLoad()

    let notification = Notification(name: noticeName, object: self, userInfo: nil)
    NotificationQueue.default.enqueue(notification, postingStyle: .whenIdle)
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    NotificationCenter.default.addObserver(forName: noticeName, object: nil, queue: nil) { (notification) in
        print("call.")
    }
}

7行目の postingStyle: に PostingStyle.whenIdle を指定することで、
アプリが何もしていない(アイドル)状態になったら通知されます。

上記のコードのアイドル状態は viewDidAppear(_:) が抜けた後なので、
その前に addObserver(forName:object:queue:using:) すると、ちゃんと call. がログに表示されます。

※公式ドキュメントはこちらです。

これをプッシュ通知がタップされた時のメソッドに書けば、安定して動くと思います。
ただ、プッシュ通知関連のメソッドは非推奨になったものもあるので、実装する際は要確認です。
ちなみに僕は以下のメソッドを使っています。

func application(_ application: UIApplication,
                 didReceiveRemoteNotification userInfo: [AnyHashable : Any],
                 fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
    let notification = Notification(name: NSNotification.Name(rawValue: "notice"), object:self, userInfo: userInfo)
    NotificationQueue.default.enqueue(notification, postingStyle: .whenIdle)
}

違うよ!とかこういう方法あるよ!ってのがあれば教えてください。
では( ¯·ω·¯ )
※2022年07月09日に再確認しました


【2019.04.21 追記】
あと、ここでは Notification.Name をそのまま使ってますが、普段は extention で定義してます。
内容が少し違ってくるので、ここに別記事で載せます。

コメント