Ios 禁用WKWebView以打开链接重定向到安装在我的iPhone上的应用

Ios 禁用WKWebView以打开链接重定向到安装在我的iPhone上的应用,ios,swift,wkwebview,Ios,Swift,Wkwebview,当我搜索谷歌并点击Etsy.com查找exmaple时,WKWebView会将我重定向到安装在iPhone上的Etsy应用程序。 如何禁用此行为?我希望WKWebView将我重定向到etsy.com移动网站。 我正在使用swift。我已经安装了Etsy应用程序,并确认在Safari中搜索“Etsy”并点击第一个结果(Etsy.com)将启动Etsy应用程序 我在Xcode中创建了一个测试“单视图应用程序”,并简单地将以下行添加到ViewController的viewDidLoad中: over

当我搜索谷歌并点击Etsy.com查找exmaple时,WKWebView会将我重定向到安装在iPhone上的Etsy应用程序。 如何禁用此行为?我希望WKWebView将我重定向到etsy.com移动网站。
我正在使用swift。

我已经安装了Etsy应用程序,并确认在Safari中搜索“Etsy”并点击第一个结果(Etsy.com)将启动Etsy应用程序

我在Xcode中创建了一个测试“单视图应用程序”,并简单地将以下行添加到
ViewController
的viewDidLoad中:

 override func viewDidLoad() {
     super.viewDidLoad()

     let webView = WKWebView(frame:view.bounds, configuration: WKWebViewConfiguration())
     view.addSubview(webView)
     webView.loadRequest(NSURLRequest(URL: NSURL(string: "https://www.google.com")!))
}
搜索etsy并单击第一个结果后,我会在测试应用程序中进入etsy.com(不会跳转到etsy应用程序)


您是否在代码中执行了其他可能导致WKWebView允许重定向的操作?

不幸的是,
WKWebView
不会将带有自定义方案的URL发送回您的应用程序以自动处理

如果您在没有特殊处理的情况下尝试此操作,则在用户使用第三方服务进行身份验证后,您的web视图看起来将挂起,并且您将永远不会收到回调。您可以尝试将重定向URI与标准http或https方案一起使用,但
WKWebView
只会尝试将其加载,而不是将其从web视图引导到您的本机应用程序进行处理

为了处理重定向,您需要在
WKWebView
WebPolicyDelegate
中执行
decidePolicyForNavigationAction
,以检测自定义URL方案并将其定向到要处理的应用程序:

func webView(webView: WKWebView, decidePolicyForNavigationAction navigationAction: WKNavigationAction, decisionHandler: ((WKNavigationActionPolicy) -> Void)) {
        print("webView:\(webView) decidePolicyForNavigationAction:\(navigationAction) decisionHandler:\(decisionHandler)")

        let app = UIApplication.sharedApplication()
        let url = navigationAction.request.URL
        let myScheme: NSString = "https"
        if (url!.scheme == myScheme) && app.canOpenURL(url!) {
            print("redirect detected..")
            // intercepting redirect, do whatever you want
            app.openURL(url!) // open the original url
            decisionHandler(.Cancel)
            return
        }

        decisionHandler(.Allow)
    }

您可以找到详细信息

在正常情况下,WKWebView不应打开第三方应用程序,而应访问网站-但我知道有两个例外

  • 如果您已在
    WKNavigationDelegate
    处理程序中显式插入一些代码以打开第三方应用程序
  • 如果iOS运行不正常(重新启动设备进行修复)-似乎有一个bug,它偶尔会创建您正在描述的行为(在iOS10.2中观察到)

您可以尝试在
WKNavigationDelegate
中截取链接,并亲自展示该网站。您可以解释更多信息吗?当然可以。如果实现
WKNavigationDelegate
,则每当单击链接时,都应调用方法
webView(\uwebview:WKWebView,decisionPolicyFornavigationAction导航操作:WKNavigationAction,decisionHandler decisionHandler:(WKNavigationActionPolicy)->Void)
。例如,检查
navigationAction.request.URL
属性以确保它不是Etsy;如果是,请使用decisionHandler取消导航,并使用
loadRequest()
亲自访问网站。希望这能阻止深层链接。没有通用的解决方案可以阻止所有深层链接?不幸的是,我还没有找到。这在iOS 9-10上不起作用。。。当我单击自定义方案url时,决不会调用decidePolicyForNavigationAction。@Borzh您找到iOS 10的解决方案了吗?不,我没有。。。我记得web团队以某种方式修复了该漏洞,但实际上不知道如何修复。这是
WKNavigationDelegate
的一部分,现在这是因为使用Apple应用程序站点关联文件的通用应用程序链接。参考