WkWebView不会加载指向pdf的链接

时间:2019-10-11 17:07:59

标签: swift wkwebview

WKWebView没有加载链接。我将用户链接到隐私策略页面,并且该页面具有一组链接。链接都是wix托管的所有pdf文件。在safari和Chrome上可以使用,但不能在WKWebView上使用。页面加载后,您单击链接,我得到一个错误:

Unknown result for URL 0x28157d110 (https)

这就是我加载网络视图的方式...

webView.load(URLRequest(url: URL(string: "https://mywebsite.io/legal")!))

编辑:这是different from other questions,因为我无意下载pdf-我只想以与Safari相同的方式显示它。

编辑:我刚刚将WKWebView替换为UIWebView(已弃用),并加载了pdfs。问题在于WKWebView。 Pdfs已启用ssl https->

let req = URLRequest(url: URL(string: "https://mywebsite.io/legal")!)
    legacyWebView.loadRequest(req)

编辑:How to open a Link to a PDF with wkwebview上有一个页面,建议您在打开pdf之前必须知道链接URL,但是我认为这不是事实。

编辑:我实现了2个委托方法,包括@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)
    }

5 个答案:

答案 0 :(得分:3)

很可能,您正在锚标记中使用target =“ _ 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;
    }
}

答案 1 :(得分:0)

我可以建议的一件事(不确定是否会有所帮助,但评论时间太长)是尝试实现WKNavigationDelegate的decidePolicyFor

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

如果有帮助,则使该功能更精细,即您只需要为PDF而不是世界上所有其他东西启用哪种导航。

答案 2 :(得分:0)

您可以检查几件事:

  1. 验证<a href链接不包含target="_blank"属性,因为WKWebView不知道如何在新选项卡中打开链接。有关解决方法,请参见https://stackoverflow.com/a/25853806/810466

  2. 检查链接是否为HTTPS或使用App Transport Security Settings选项更新Allow Arbitrary Loads

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

    < / li>
  4. 实施WKWebView NavigationDelegate方法,并确保在确定请求策略时返回WKNavigationActionPolicyAllow

答案 3 :(得分:0)

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

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

然后,如果链接具有target="_blank"

,您可能还需要实现以下方法
func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {

答案 4 :(得分:-1)

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