加载本地资源时UIWebView和WKWebView有什么区别

What's the difference between UIWebView and WKWebView when loading local resources

我想用webView加载本地资源。我用 UIWebView 和 WKWebView 构建了一个演示,用下面的代码做一些测试。

    let uiWebView = UIWebView(frame: self.view.bounds)
    self.view.addSubview(uiWebView)

    let wkWebView = WKWebView(frame:CGRect(x: 0, y: 400, width: 500, height: 500))
    self.view.addSubview(wkWebView)

    let path = Bundle.main.path(forResource:"1", ofType: "png")

    guard let realPath = path else {
        return
    }

    let url = URL(string: realPath)
    let fileUrl = URL(fileURLWithPath: realPath)

    if let realUrl = url {
        uiWebView.loadRequest(URLRequest(url:realUrl))
        wkWebView.load(URLRequest(url:realUrl))
    }


  // uiWebView.loadRequest(URLRequest(url:fileUrl))
  // wkWebView.load(URLRequest(url:fileUrl))

uiWebView可以加载资源,wkWebView不能。但是如果我使用

  uiWebView.loadRequest(URLRequest(url:fileUrl))
  wkWebView.load(URLRequest(url:fileUrl))

uiWebView 和 wkWebView 都可以正常工作。 我很困惑,谁能为我解释一下: 我不应该使用 URL(string: realPath) 作为本地资源吗?但是为什么 UIWebView 可以用呢?

这可能是出于安全原因,或者只是 WKWebView API 的实施方式。

WKWebView 有一个用于加载本地资源的特定实例方法,称为 loadFileURL(_:allowingReadAccessTo:)。这是在 iOS 9.

中引入的

备注

如果您的目标是 iOS 8.0 或更高版本,您应该使用 WKWebView 而不是 UIWebView。参见:https://developer.apple.com/reference/webkit/wkwebview

几点:

  1. Apple recommends 您将 WKWebview 用于 iOS 8 及更高版本。我会避免使用 UIWebView.
  2. 编写新代码

In apps that run in iOS 8 and later, use the WKWebView class instead of using UIWebView. Additionally, consider setting the WKPreferences property javaScriptEnabled to false if you render files that are not supposed to run JavaScript.

  1. Apple 一直在尝试摆脱 path,而是想对本地文件使用 URI。他们建议您不要使用 /path/to/file.png 而是使用 file:///path/to/file.png

至于为什么一个 URL 有效而另一个无效,让我们举一个最小的例子:

let realPath = "/path/to/file.png"
let url = URL(string: realPath)               // /path/to/file.png
let fileUrl = URL(fileURLWithPath: realPath)  // file:///path/to/file.png
  • url不提供方案(a.k.a协议)。它只能与另一个 URL 结合使用,以提供您尝试访问的资源的绝对地址。 UIWebView 出于向后兼容性的原因支持它,但 Apple 决定从 WKWebView 开始清理。
  • fileURL 有一个方案 (file://) 告诉资源位于本地文件系统上。其他常见方案有 httphttpsftp 等。它是资源的完整地址,因此两个视图都知道如何解析它。