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

Posted

技术标签:

【中文标题】禁用 WKWebView 以打开链接以重定向到我的 iPhone 上安装的应用程序【英文标题】:Disable WKWebView for opening links to redirect to apps installed on my iPhone 【发布时间】:2016-05-07 09:04:26 【问题描述】:

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

【问题讨论】:

您可以尝试截取WKNavigationDelegate中的链接并自己展示网站。 你能解释一下吗? 当然。如果您实现WKNavigationDelegate,则每当单击链接时都应调用方法webView(_ webView: WKWebView, decidePolicyForNavigationAction navigationAction: WKNavigationAction, decisionHandler decisionHandler: (WKNavigationActionPolicy) -> Void)。例如,检查 navigationAction.request.URL 属性以确保它不是 Etsy;如果是,请使用decisionHandler 取消导航并使用loadRequest() 自己访问网站。希望这会阻止深度链接。 这个问题没有通用的解决方案会阻止所有的深层链接吗? 很遗憾,我还没有找到。 【参考方案1】:

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

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

为了处理重定向,您需要在您的WKWebViewWebPolicyDelegate 中实现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)
    

您可以找到详细信息here

【讨论】:

这在 ios 9-10 上不起作用...当我点击自定义方案 url 时,决不会调用 decisionPolicyForNavigationAction。 @Borzh 你找到 iOS 10 的解决方案了吗? 不,我没有......我记得网络团队以某种方式修复了这个错误,但不知道如何,真的。 现在是WKNavigationDelegate 的一部分【参考方案2】:

我已安装 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 允许重定向的操作?

【讨论】:

这是因为通用应用链接使用 Apple 应用网站关联文件。参考developer.apple.com/library/archive/documentation/General/…【参考方案3】:

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

如果您已在 WKNavigationDelegate 处理程序中明确插入一些代码以打开第 3 方应用程序 如果 iOS 工作不正常(重新启动设备以修复) - 似乎有一个错误,偶尔会产生您所描述的行为(在 iOS10.2 中观察到)

【讨论】:

以上是关于禁用 WKWebView 以打开链接以重定向到我的 iPhone 上安装的应用程序的主要内容,如果未能解决你的问题,请参考以下文章

如何更改我的注销路线以重定向到我的主页

Swift 5 禁用从 WKWebView 到不同应用程序的重定向

Laravel 存储 GET 参数以重定向回

如何使用 actionButton 打开菜单子项

UIWebView 和 WKWebView 导航

在UpdateView上获取删除按钮以重定向时出现问题