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

时间:2016-12-14 03:39:45

标签: ios uiwebview wkwebview

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


curl -F fabric_key=<key> \
  -F build_secret=<secret> \
  -F dsym_zipfile=@<path-to-zip> \
  https://fabric.io/api/v2/upload-dsyms

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都能正常运行。 我很困惑,任何人都可以为我解释: 我不应该为本地资源使用URL(字符串:realPath)吗?但是为什么UIWebView可以使用它呢?

2 个答案:

答案 0 :(得分:33)

几点:

    对于iOS 8及更高版本,您使用WKWebview的Apple recommends。我会避免使用UIWebView编写新代码。
      

    在iOS 8及更高版本中运行的应用中,请使用WKWebView类而不是UIWebView。另外,如果您渲染不应运行JavaScript的文件,请考虑将WKPreferences属性javaScriptEnabled设置为false

    1. Apple一直试图摆脱路径而宁愿使用 URI 甚至是本地文件。他们建议您不要使用/path/to/file.png并使用file:///path/to/file.png代替。
    2. 至于为什么一个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等。它是资源的完整地址,因此两个视图都知道如何解决它。

答案 1 :(得分:3)

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

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

注意

如果您定位的是iOS 8.0或更高版本,则应使用WKWebView代替UIWebView。请参阅:https://developer.apple.com/reference/webkit/wkwebview