退出应用后,在本地通知点击时推送视图控制器

时间:2019-02-08 20:21:39

标签: ios swift iphone

我正在开发一个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)
}

请注意,我没有在此应用中使用情节提要。

致谢

1 个答案:

答案 0 :(得分:0)

这是可以实现通知点击处理的一种方法。

  1. 观察appdelegate回调中的通知
  2. appdelegate获取RootNavigationController对象
  3. 创建DashboardViewController实例
  4. 覆盖rootNavigationController viewcontroller堆栈中的实例
  5. 就这样。

在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]
    }
}