iOS 应用程序中 ViewController 的深层链接仅在启动后有效

Deeplink to ViewController in iOS app only works once after start

我正在使用以下代码深入 link(例如从 Safari 浏览器)到我的应用程序中的特定 ViewController:

func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool{
    if(url.host == nil){
        window?.rootViewController?.performSegueWithIdentifier("DeepLinkSegue", sender: nil)
        print("Push-VC opened!")
        print(window?.rootViewController)
        print(window)
    }
    return true
}

在 Safari 浏览器中输入 dlapp:// 时,它应该会打开 ViewController 并带有 segue 标识符“DeepLinkSegue”。工作正常,ViewController 打开。

但仅在启动应用程序后一次。当您转到另一个 VC 并再次尝试使用“dlapp://”打开特定的 VC 时,只会打开应用程序,而不是特定的 VC。您必须重新启动应用程序,否则它将无法运行,只会打开应用程序而不是特定的 VC.

我一开始以为这个函数可能只调用了一次。但并非如此,因为 print("DL-VC opened!") 总是打印。在我的代码中使用三个 print() 函数在控制台中输出:

Push-VC opened!
Optional(<DeepLinkTest.ViewController: 0x157da1d40>)
Optional(<UIWindow: 0x157da3830; frame = (0 0; 414 736); autoresize = W+H; gestureRecognizers = <NSArray: 0x157da4a90>; layer = <UIWindowLayer: 0x157da1530>>)

您可以在此处下载重现问题的项目:http://www.filedropper.com/deeplinktest_1

此致, 大卫.

问题是 segue 会一个接一个地出现 vc,然后你不能让 rootviewcontroller 执行 segue,尝试像这样改变 rootviewcontroller :

func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool{
    if(url.host == nil){
        let sb = UIStoryboard(name: "Main", bundle: nil)
        let vc = sb.instantiateInitialViewController()
        window?.rootViewController = vc

        window?.rootViewController?.performSegueWithIdentifier("DeepLinkSegue", sender: nil)
        print("Push-VC opened!")
        print(window?.rootViewController)
        print(window)
    }
    return true
}

希望对您有所帮助:-)