iOS Swift 从推送通知以编程方式导航到某些 ViewController

Posted

技术标签:

【中文标题】iOS Swift 从推送通知以编程方式导航到某些 ViewController【英文标题】:iOS Swift Navigate to certain ViewController programmatically from push notification 【发布时间】:2017-08-20 20:38:59 【问题描述】:

我使用推送通知来通知用户应用中发生的不同类型的事件。某种类型的推送通知应该打开一个特殊的视图控制器(例如,关于新聊天消息的通知确实会在点击时导航到聊天)

为了实现这一点,我在我的应用委托中尝试了以下代码:

func applicationDidBecomeActive(_ application: UIApplication) 
 if var topController = UIApplication.shared.keyWindow?.rootViewController 
        while let presentedViewController = topController.presentedViewController 
            topController = presentedViewController
        
        topController.tabBarController?.selectedIndex = 3
    

它不会移动到任何地方。我在这里错过了什么?

【问题讨论】:

所以你在这里有一个标签栏,你希望它在每次应用激活时转到标签#4? 选择了 didbecomeactive 来测试它,但是是的,我有一个标签栏控制器,并且标签 #4 是正确的 把你的rootViewController改成标签栏控制器就OK了 可能为 topController 添加as! UITabbarViewController 会起作用 【参考方案1】:

我编写了一个简单的类,只需传递类类型即可从一行代码中的任何位置导航到视图层次结构中的任何视图控制器,因此您将编写的代码也将与视图层次结构本身解耦,因为实例:

Navigator.find(MyViewController.self)?.doSomethingSync()
Navigator.navigate(to: MyViewController.self)?.doSomethingSync()

..或者你也可以在主线程上异步执行方法:

Navigator.navigate(to: MyViewController.self)  (MyViewControllerContainer, MyViewControllerInstance) in
    MyViewControllerInstance?.doSomethingAsync()

这里是 GitHub 项目链接:https://github.com/oblq/Navigator

【讨论】:

这段代码在哪里写?因为我收到错误“NotificationVC”类型的值没有成员“doSomethingSync”,NotificationVC 是我的视图控制器 @roshanposakya 'doSomethingSync' 是一个发明的函数,设置你的 'NotificationVC' 的真实函数。 Navigator.find 或 Navigator.navigate 返回您的 VC 的实例,因此,Navigator.find(NotificationVC.self) 与调用 NotificationVC() 完全一样……所以,在 Navigator.find(NotificationVC.self)? 之后。您可以调用任何 NotificationVC func 或 var。【参考方案2】:

这正是您所需要的。 使用导航控制器推送通知视图控制器

    let mainStoryBoard : UIStoryboard       = UIStoryboard(name: "Main", bundle: nil)
    let navigationController : UINavigationController = mainStoryBoard.instantiateViewController(withIdentifier: "MainNavigationController") as! UINavigationController

    let notifcontrol : UIViewController     = (mainStoryBoard.instantiateViewController(withIdentifier: "NotificationViewController") as? NotificationViewController)!

    navigationController.pushViewController(notifcontrol, animated: true)

    self.window = UIWindow(frame: UIScreen.main.bounds)
    self.window?.rootViewController = navigationController
    self.window?.makeKeyAndVisible()

【讨论】:

【参考方案3】:

在这种情况下,topController 已经是我的 TabBarController!

【讨论】:

以上是关于iOS Swift 从推送通知以编程方式导航到某些 ViewController的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式从 iOS Swift 3 中的 XIB 推送和呈现给 UIViewController

Swift导航到View from notification

iOS 5 推送通知 - 从开发的角度来看

无法从以编程方式创建的 UINavigationController 推送

在 AppDelegate iOS 中单击 FCM 推送通知时导航到特定选项卡 - Swift

未使用 Apple 推送通知设置通知徽章计数 - swift - 以编程方式