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

Ruf*_*fus 30 uiwebview ios 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))
Run Code Online (Sandbox Code Playgroud)

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

  uiWebView.loadRequest(URLRequest(url:fileUrl))
  wkWebView.load(URLRequest(url:fileUrl))
Run Code Online (Sandbox Code Playgroud)

uiWebView和wkWebView都能很好地工作.我很困惑,任何人都可以解释一下:我不应该为本地资源使用URL(字符串:realPath)吗?但是为什么UIWebView可以使用它呢?

Cod*_*ent 36

几点:

  1. Apple 建议您使用WKWebviewiOS 8及更高版本.我会避免用新的代码编写代码UIWebView.

在iOS 8及更高版本中运行的应用程序中,请使用WKWebView该类而不是使用UIWebView.此外,考虑设置WKPreferences属性javaScriptEnabledfalse,如果你渲染不应该运行JavaScript文件.

  1. Apple一直试图摆脱路径,而是希望将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
Run Code Online (Sandbox Code Playgroud)
  • url不提供方案(又称协议).它应该只与另一个URL一起使用,以提供您尝试访问的资源的绝对地址.UIWebView支持它是出于向后兼容的原因,但Apple决定开始使用WKWebView.
  • fileURL有一个scheme(file://),告诉资源位于本地文件系统上.其他常见的方案是http,https,ftp等,这是一个完整的地址资源,以便两个视图知道如何解决它.