【问题标题】:WkWebView does not load links to pdfsWkWebView 不加载指向 pdf 的链接
【发布时间】:2020-02-09 05:53:56
【问题描述】:

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(已弃用)并加载了 pdf。问题在于 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)
    }

【问题讨论】:

  • @KirilS。我不是想下载它们,我只是想像 safari 一样显示它们,除非你是这个意思
  • 它给了你一堆关于它可能是什么的想法,例如,我会把钱花在你试图从 http 下载 PDF 上,而你的 URL 是 https (请参阅那里的回复) . WebView 不喜欢这样的东西
  • 两者都是https。
  • 如果您尝试放松权限怎么办,例如设置NSAllowsArbitraryLoads 或相关密钥NSAllowsArbitraryLoadsInWebContent developer.apple.com/documentation/bundleresources/… 如果有效,则证明这些链接的安全性不正确如果不正确,则意味着看其他方向

标签: swift wkwebview


【解决方案1】:

您可以检查以下几点:

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

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

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

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

【讨论】:

  • 第二个是我的问题!回到一个旧项目,我确信它以前有效。但是现在使用 XCode 12 构建,如果没有长按,WKWebView 页面上的链接将无法打开!切换到 HTTPS 解决了问题!
【解决方案2】:

很可能,您在锚标记中使用了 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;
    }
}

【讨论】:

  • 即使我的 URL 没有 target="_blank",我的 WKWebview 仍然无法将它们加载到位。实现此委托后,一切都按预期工作。非常感谢!
【解决方案3】:

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

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

如果有帮助,那么让该功能更加精细,即您需要为 PDF 启用哪个导航,而不是世界上的所有其他内容。

【讨论】:

    【解决方案4】:

    首先你应该把它添加到你的委托中:

    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? {
    

    【讨论】:

      【解决方案5】:

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

      【讨论】:

      • 如果链接被放置为目标_blank 或在HTML 链接中使用download 关键字,有时它是多种因素的组合。
      猜你喜欢
      • 2019-12-27
      • 2016-08-31
      • 2013-10-07
      • 2017-05-24
      • 1970-01-01
      • 1970-01-01
      • 2017-11-15
      • 2014-04-11
      • 1970-01-01
      相关资源
      最近更新 更多