Swift WkWebView不加载指向PDF的链接

Swift WkWebView不加载指向PDF的链接,swift,wkwebview,Swift,Wkwebview,WKWebView未加载链接。我正在将用户链接到隐私政策页面,该页面有一组链接。这些链接都是wix托管的PDF。在safari和Chrome上可以工作,但在WKWebView上不行。当页面加载时,您单击链接,我只得到一个错误: Unknown result for URL 0x28157d110 (https) 这就是我加载web视图的方式 webView.load(URLRequest(url: URL(string: "https://mywebsite.io/legal")!)) 编辑

WKWebView未加载链接。我正在将用户链接到隐私政策页面,该页面有一组链接。这些链接都是wix托管的PDF。在safari和Chrome上可以工作,但在WKWebView上不行。当页面加载时,您单击链接,我只得到一个错误:

Unknown result for URL 0x28157d110 (https)
这就是我加载web视图的方式

webView.load(URLRequest(url: URL(string: "https://mywebsite.io/legal")!))
编辑:这是因为我没有下载pdf的意图-我只想以Safari相同的方式显示它

编辑:我刚刚用UIWebView(已弃用)替换了WKWebView,并加载了PDF。问题在于WKWebView。PDF是支持ssl的https->

let req = URLRequest(url: URL(string: "https://mywebsite.io/legal")!)
    legacyWebView.loadRequest(req)
编辑:这里有一个页面建议你在打开pdf之前必须知道链接URL,但我不认为这是真的

编辑:我实现了两个委托方法,包括@Kiril建议的下面一个。指向PDF的链接仍然没有打开

func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
        decisionHandler(WKNavigationActionPolicy.allow)
    }
    func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) {
        decisionHandler(WKNavigationResponsePolicy.allow)
    }
我可以建议的一件事(不确定是否有帮助,但太长了,无法发表评论)是尝试实现WKNavigationDelegate的决策:

// WKNavigationDelegate
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
    decisionHandler(.allow)
}

如果有帮助,那么就让该功能更精细化,即只为PDF启用哪些导航,而不是世界上的所有导航。

您可以检查以下几点:

  • 验证如何解决该问题的

  • 检查链接是否为HTTPS或使用
    允许任意加载
    选项更新
    应用程序传输安全设置

  • 请确保仅在将WKWebView添加到
    didMoveToParentViewController:
    中的视图层次结构后才启动加载请求,因为如果javascript尝试在视图层次结构之外运行,可能会导致javascript失败

  • 实现WKWebView NavigationDelegate方法,并确保在决定请求的策略时返回
    WKNavigationActionPolicyAllow


  • 我仍然不知道真正的原因是什么,但当我将文件的宿主从Wix更改为S3时,我不再遇到问题。

    首先,您应该将此添加到您的代理中:

    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
         decisionHandler(WKNavigationActionPolicy.allow)
    }
    
    如果链接有
    target=“\u blank”


    很可能,您正在锚定标记中使用target=“\u blank”。这将打开一个新窗口以显示链接。WKWebView正在阻止您尝试打开新窗口(至少在默认情况下)

    下面的代码仍然不会创建新窗口,而是在当前WKWebView中打开PDF等链接。 另一个选项似乎是创建一个新的WKWebView并返回它,这样ios就可以在其中打开链接。我不希望每次点击WKWebView中的网站都会创建额外的视图

    在您的ViewController.viewDidLoad中

    webView.uiDelegate = self
    
    然后为委托添加扩展名

    extension ViewController: WKUIDelegate {
    
        /**
         * Force all popup windows to remain in the current WKWebView.
         * By default, WKWebView is blocking new windows from being created
         * ex <a href="link" target="_blank">text</a>.
         * This code catches those popup windows and displays them in the current WKWebView.
         */
        func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
    
            // open in current view
            webView.load(navigationAction.request)
    
            // don't return a new view to build a popup into (the default behavior).
            return nil;
        }
    }
    
    扩展视图控制器:WKUIDelegate{
    /**
    *强制所有弹出窗口保留在当前WKWebView中。
    *默认情况下,WKWebView阻止创建新窗口
    *前。
    *此代码捕获这些弹出窗口并将其显示在当前的WKWebView中。
    */
    func webView(webView:WKWebView,createWebViewWith配置:WKWebViewConfiguration,用于导航操作:WKNavigationAction,windowFeatures:WKWindowFeatures)->WKWebView{
    //在当前视图中打开
    加载(navigationAction.request)
    //不要返回新视图来构建弹出窗口(默认行为)。
    返回零;
    }
    }
    
    可能重复@KirilS。我不是想下载它们,我只是想像safari那样显示它们,除非这是你的意思。它给了你一系列关于它可能是什么的想法,例如,我会花钱让你尝试从http下载PDF,而你的URL是https(见其中一个回复)。WebView不喜欢这样的东西,两者都是https。如果你试图放松权限,例如设置
    NSAllowsArbitraryLoads
    或相关密钥
    nsAllowsArbitraryLoadsWebContent
    ,如果它起作用,将证明这些链接的安全性中的某些东西不正确,意味着在其他方向查看有时这是多种因素的组合,如果链接被放置为目标
    \u blank
    或在HTML链接中使用
    下载
    关键字。即使我的URL没有target=“\u blank”,我的WKWebview仍不会将其加载到位。实现此委托后,一切都按预期进行。谢谢!第二是我的问题!回到一个老项目,我相信它以前是有效的。但是现在使用XCode 12和WKWebView页面上的链接进行构建时,如果不长按,将无法打开!切换到HTTPS解决了这个问题!
    extension ViewController: WKUIDelegate {
    
        /**
         * Force all popup windows to remain in the current WKWebView.
         * By default, WKWebView is blocking new windows from being created
         * ex <a href="link" target="_blank">text</a>.
         * This code catches those popup windows and displays them in the current WKWebView.
         */
        func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
    
            // open in current view
            webView.load(navigationAction.request)
    
            // don't return a new view to build a popup into (the default behavior).
            return nil;
        }
    }