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



我想用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(字符串:RealPath)用于本地资源吗?但是,为什么UIWebView可以使用它呢?

一个点:

  1. Apple建议您在iOS 8及以后使用WKWebview。我会避免用UIWebView编写新代码。

在iOS 8和以后运行的应用中,使用WKWebView类而不是使用UIWebView。此外,如果渲染不应该运行JavaScript的文件,请考虑将WKPreferences属性javaScriptEnabled设置为false

  1. Apple一直在尝试远离 path ,而是想使用 uri 甚至用于本地文件。他们建议您不使用/path/to/file.png并改用file:///path/to/file.png

关于一个URL为什么工作而另一个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不提供该方案(又称协议)。它只能与另一个URL结合使用,以提供您要达到的资源的绝对地址。UIWebView出于向后兼容的原因支持它,但Apple决定使用WKWebView开始清洁。
  • fileURL具有一个方案(file://),该方案告诉资源位于本地文件系统上。其他常见方案是httphttpsftp等。它是资源的完整地址,因此两个视图都知道如何解决。

这可能是出于安全原因,或者只是如何实现WKWebView API。

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

注意

如果您针对iOS 8.0或更新,则应使用WKWebView而不是UIWebView。请参阅:https://developer.apple.com/reference/webkit/wkwebview

相关内容

  • 没有找到相关文章

最新更新