ios - 应用程序退出后,在本地通知点击时推送 View Controller

标签 ios swift iphone

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

问候

最佳答案

这是实现通知点击处理的方法之一。

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

在应用程序委托(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/

相关文章:

iphone - 如何在搜索 iPhone 期间检查某个项目是否已下载

iPhone App - 内存警告后背景消失

iphone - 从越狱的iPhone上的控制台打开wifi/蓝牙/网络共享

swift - 如何创建和访问共享应用程序组文档目录?

ios - react native : Flex for ScrollView doesn't work

ios - 为什么 viewDidAppear 没有调用?

ios - 无法在 ios9 上的 swift2 中获取航向数据(用于 compass 应用程序)

iphone - 如何构建 iPhone 应用程序以在客户帐户上分发?

ios - 属性 setter responseToSelector

ios - 与传递对象保持循环