ログイン後だったり、画面が完全に構築されてからプッシュ通知のデータを扱いたい場合、
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 で定義してます。
内容が少し違ってくるので、ここに別記事で載せます。


コメント