如何将通用链接连接到 UIViewController?

How to connect Universal Links to UIViewController?

*Disclaimer: I've only been coding in iOS/XCode/Swift for a couple of weeks

我有 Universal Links 在我的应用程序外单击 link 打开应用程序,我在 AppDelegate class 中捕获 Url。

这样就好了。

我的问题是...然后如何重定向到正确的 UIViewController 并从我的 URL 向控制器传递一些信息?所有通用 Link 教程在到达该部分之前就停止了。

特别是我对 AppDelegate 的生命周期及其与 UI 的关系感到困惑ViewController。

我的应用有两个 UIViewController 位于(对吗?)一个 UINavigationController 下。

我试过的

我尝试在 AppDelegate 中处理 url 事件,并设置 public 属性,然后在我的 ViewController 中获得对 AppDelegate 的访问权限。但是,单击通用 Link 后,viewDidLoadviewWillAppear 都不会再次被调用 :-/

从 AppDelegate 重定向到 ViewController 的最佳方法是什么?我的目标只是加载根视图控制器,但我需要从 URL 传递一些数据。怎么样?

这取决于您的应用架构。您绝对可以假设 AppDelegate 具有对 rootViewController (window?.rootViewController) 的引用。你应该知道那个控制器的类型是什么。然后你可以访问其他等等。无论如何,这个问题在我看来太笼统了。

  1. 首先,阅读你的URL。

  2. 从URL

    获取参数
  3. 启动你的目标控制器

  4. 将您的参数设置为该控制器

  5. 根视图控制器上的当前控制器

         let urlString = url.absoluteString
         let queryArray = urlString.componentsSeparatedByString("/")
    
         if queryArray[2].lowercaseString == "yourQuery" {
             let queryId = Int(queryArray[3])
    
             if self.window?.rootViewController?.presentedViewController != nil {
                 self.window?.rootViewController?.dismissViewControllerAnimated(false, completion: nil)
             }
    
             let queryVC = self.window?.rootViewController?.storyboard?.instantiateViewControllerWithIdentifier(QUERY_SCENE) as? QueryViewController
             queryVC?.urlQueryId = queryId!
             self.window?.rootViewController?.presentViewController(queryVC!, animated: true, completion: nil)
        }
    

编辑:

  1. 在导航控制器上推送一个控制器说 'PresentedViewController' 如果 rootViewController 也是导航控制器

  2. 并在背面按下控制器 'OnBackPressViewController' 当前控制器 'PresentedViewController'

         if self.window?.rootViewController?.presentedViewController != nil {
             self.window?.rootViewController?.dismissViewControllerAnimated(false, completion: nil)
         }
         let navController = self.window?.rootViewController?.storyboard?.instantiateInitialViewController() as? UINavigationController
         let presentedVC = self.window?.rootViewController?.storyboard?.instantiateViewControllerWithIdentifier(PRESENTED_SCENE) as? PresentedViewController
         //Pass parameters to PresentedViewController
         let onBackPressViewController = self.window?.rootViewController?.storyboard?.instantiateViewControllerWithIdentifier(ON_BACK_PRESS_SCENE) as? OnBackPressViewController
         navController!.pushViewController(onBackPressViewController!, animated: true)
         navController!.pushViewController(presentedVC!, animated: true)
         self.window?.rootViewController?.presentViewController(navController!, animated: true, completion: nil)
    

你可以根据那个更新你的代码。永远记住,你必须在 rootViewController 上呈现任何视图控制器。