Как подключить универсальные ссылки к UIViewController?

* Отказ от ответственности: я только кодировал в iOS/XCode/Swift в течение нескольких недель

У меня есть Universal Links, работающая в том, что, щелкая ссылку вне моего приложения, вы открываете приложение, и я перехватываю URL в классе AppDelegate.

Так что все хорошо.

У меня вопрос... как мне тогда перенаправить на правильный UIViewController И передать контроллеру некоторую информацию из моего URL? Все учебники Universal Link останавливаются до того, как они перейдут к этой части.

В частности, я запутался в жизненных циклах AppDelegate и в том, как он связан с UIViewController.

У моего приложения было два UIViewController, сидящий под (верно?) UINavigationController.

Что я пробовал

Я попытался обработать событие url в AppDelegate и установить открытое свойство, а затем в моем ViewController получить доступ к AppDelegate. ОДНАКО после нажатия на Универсальную ссылку, оба viewDidLoad а также viewWillAppear не звони снова:-/

Какой лучший способ перенаправить на ViewController из AppDelegate? Моя цель - просто загрузить контроллер корневого представления, НО мне нужно передать некоторые данные из URL. Как?

2 ответа

Решение
  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.

Это зависит от архитектуры вашего приложения. Вы можете определенно предположить, что AppDelegate имеет ссылку на rootViewController (window?.rootViewController). Вы должны знать, какой тип этого контроллера. Тогда вы можете получить доступ к другому и так далее. Этот вопрос, во всяком случае, слишком общий на мой взгляд.

Другие вопросы по тегам