WkWebView 不加载 pdf 链接

WkWebView does not load links to pdfs

WKWebView 未加载 link。我正在 link 引导用户访问隐私政策页面,该页面有一组 link。 link 都是由 wix 托管的 pdf。在 safari 和 Chrome 上有效,但在 WKWebView 上无效。当页面加载并单击 links 时,我只收到一个错误:

Unknown result for URL 0x28157d110 (https)

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

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

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

编辑:我刚刚将 WKWebView 替换为 UIWebView(已弃用)和 pdfs 加载。问题出在 WKWebView 上。 Pdfs 是支持 ssl 的 https ->

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

编辑:这里有一个页面 建议您在打开 pdf 之前必须知道 link 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)
    }

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

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

如果有帮助,请使该功能更细化,即您需要为 PDF 启用哪些导航,而不是世界上所有其他内容。

您可以检查以下几项内容:

  1. 验证 <a href links 不包含 target="_blank" 属性,因为 WKWebView 不知道如何打开 link一个新标签。请参阅 了解如何解决该问题。

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

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

  4. 实施 WKWebView NavigationDelegate 方法并确保您 return WKNavigationActionPolicyAllow 在决定​​请求策略时

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

首先,您应该将此添加到您的委托中:

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

那么如果link有target="_blank"

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

您可能在锚标记中使用了 target="_blank"。这会打开一个新的 window 来显示 link。 WKWebView 正在阻止您尝试打开新的 window(至少在默认情况下)。

下面的代码仍然没有创建新的window,而是在当前WKWebView 中打开PDF 等link。 另一个选项似乎是创建一个新的 WKWebView 和 return 它,以便 ios 可以打开其中的 link。我不希望每次点击 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;
    }
}