我正在开发一个iOS应用,在其中执行后台获取,如果满足某些条件,则会发布本地通知。
我想要的是,当用户点击通知时,应将UIViewController
类型的视图控制器推到DashboardViewController
类型的UINavigationController
上。
我为UNUserNotification
实现了自定义委托,每当用户点击通知时,我都会在其中发布通知。然后,我在DashboardViewController中为该通知添加了一个观察者。
如果观察者捕获到该通知,则会将视图控制器推到NavigationController上。
只要应用程序在后台/前景中运行,此方法就可以正常工作。当我从最近的活动表中删除该应用程序并点击通知时,仅加载主视图。另一个视图控制器没有被推到该视图控制器上。
这是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)
}
请注意,我没有在此应用中使用情节提要。
致谢
答案 0 :(得分:0)
这是可以实现通知点击处理的一种方法。
appdelegate
回调中的通知appdelegate
获取RootNavigationController对象viewcontroller
堆栈中的实例在Appdelegate中,
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控制器中添加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]
}
}