我正在开发一个 iOS 应用程序,其中执行后台提取,如果满足某些条件,则会发布本地通知。
我想要的是当用户点击通知时类型为 UIViewController
的 View Controller 应该推送到 DashboardViewController
其类型为 UINavigationController
.
我已经为 UNUserNotification
实现了自定义委托(delegate)每当用户点击通知时,我都会在其中发布通知。然后,我在 DashboardViewController 中添加了该通知的观察者。
如果观察者捕获到该通知,它将 View Controller 推送到 NavigationController 上。
只要应用程序在后台/前台运行,这就可以正常工作。当我从最近的事件表中删除应用程序并点击通知时,仅加载主视图。另一个 View Controller 不会推送到此 View Controller 上。
这是来自 UNUserNotificationDelegate
的代码:
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
switch response.actionIdentifier {
case UNNotificationDefaultActionIdentifier:
NotificationCenter.default.post(name: .didTapOnAttendanceNotification, object: nil)
completionHandler()
case UNNotificationDismissActionIdentifier:
completionHandler()
default:
completionHandler()
break
}
}
这是我在我的 DashboardViewController
的 viewWillAppear 中使用的代码:
// Override view will appear
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
// Add observer for notification tap
NotificationCenter.default.addObserver(self, selector: #selector(attendanceDidTap), name: .didTapOnAttendanceNotification, object: nil)
// Add observer for biometry
NotificationCenter.default.addObserver(self, selector: #selector(handleReauth), name: .isReauthRequired, object: nil)
}
请注意,我没有为此应用程序使用 Storyboard 。
问候
最佳答案
这是实现通知点击处理的方法之一。
- 观察
appdelegate
回调中的通知点击 - 从
appdelegate
获取 RootNavigationController 对象 - 创建 DashboardViewController 实例
- 覆盖 rootNavigationController
viewcontroller
堆栈中的实例 - 就是这样。
在应用程序委托(delegate)中,
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
guard let appDelegate = UIApplication.shared.delegate as? AppDelegate, let window = appDelegate.window, let rootNav = window.rootViewController as? RootNavigationController else {
return
}
// instantiate dashboardViewController
// Call the override function from here with dashboardController
rootNav.overrideDefaultViewController(viewController: DashboardController)
}
在 RootNavigation Controller 中添加 overrideDefaultViewController 函数
class RootNavigationController: UINavigationController {
override init(rootViewController: UIViewController) {
super.init(rootViewController: rootViewController)
}
// Pass the dasboard view controller here
func overrideDefaultViewController(viewController: UIViewController) {
self.viewControllers = [viewController]
}
}
关于ios - 应用程序退出后,在本地通知点击时推送 View Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54599649/