iOS 13 中的本地通知 didReceive

Posted

技术标签:

【中文标题】iOS 13 中的本地通知 didReceive【英文标题】:Local notifications didReceive in iOS 13 【发布时间】:2020-04-12 09:36:58 【问题描述】:

我正在我的应用程序中实现通知,当用户按下通知时,我无法弄清楚如何转到特定的视图控制器。从 ios 13 开始,我的应用程序正在使用 SceneDelegate,但函数:userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) 仅在 AppDelegate 中被调用。

当我的应用程序使用 SceneDelegate 时,当用户点击通知时,我如何才能转到特定的视图控制器? 我在网上找到的所有资源都涉及您选择视图的 iOS 12 或更低版本来自 AppDelegate 的控制器。

【问题讨论】:

您可以从UIApplication 获取活动场景并选择一个场景以在其中显示视图控制器 【参考方案1】:

有几种方法,一种简单的方法是通过 NotficationCeneter 发布通知。

NotificationCenter.default.post(name: Notification.Name("SOME_NAME"), object: nil, userInfo: nil)

你应该为这个通知添加一个观察者。

 NotificationCenter.default.addObserver(self, selector: #selector(someMethod(notification: )), name: Notification.Name("SOME_NAME"), object: nil)

还有不同的选择

例如,我创建了一个简单的 Navigator 类,它是 Singleton,它保留顶部 NavigationController 以及有关当前视图堆栈的所有知识。 如果我需要从 AppDelegate 打开一些特定的屏幕,我会使用类似的东西:

MyNavigator.shared.goToSomeScreen()

不过,一切都取决于您当前的代码是什么以及您的需求是什么,确保您可以找到更适合您的代码。

【讨论】:

使用通知有效!唯一的问题是在 iPad 上,如果我打开了多个窗口,所有窗口都会转到指定的视图控制器。您是否碰巧知道只有焦点所在的场景才会呈现视图控制器的方式? 抱歉,不知道该怎么做。但也许您可以检查场景是否失去焦点以移除观察者,以及是否成为焦点以添加观察者。或者,如果您有导航器的想法,导航器可以知道重点是什么。

以上是关于iOS 13 中的本地通知 didReceive的主要内容,如果未能解决你的问题,请参考以下文章

应用程序未运行时未调用本地通知的 UNUserNotificationCenterDelegate didReceive 响应

如何在 ios 10 中为不同的本地通知启动不同的视图控制器

什么是 UserNotification 框架相当于 didReceive 通知:UILocalNotification?

UNUserNotificationCenter didReceive / willPresent未触发ios 11

userNotificationCenter didReceive 响应包含空通知(watchOS)

未调用 UserNotifications 扩展服务 UNNotificationAction didReceive 操作委托。