ログイン後だったり、画面が完全に構築されてからプッシュ通知のデータを扱いたい場合、
NotificationQueue を使うと安定するのでメモしやす。
まずは挙動が掴めるよう簡単なコードを。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
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. がログに表示されます。
※公式ドキュメントはこちらです。
これをプッシュ通知がタップされた時のメソッドに書けば、安定して動くと思います。
ただ、プッシュ通知関連のメソッドは非推奨になったものもあるので、実装する際は要確認です。
ちなみに僕は以下のメソッドを使っています。
1 2 3 4 5 6 |
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 で定義してます。
内容が少し違ってくるので、ここに別記事で載せます。
コメント