【问题标题】:What's the difference between UIWebView and WKWebView when loading local resources加载本地资源时UIWebView和WKWebView有什么区别
【发布时间】:2016-12-14 03:39:44
【问题描述】:

我想用 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 可以使用呢?

【问题讨论】:

    标签: ios uiwebview wkwebview


    【解决方案1】:

    几点:

    1. Apple recommends,您在 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 有效而另一个无效,让我们举个小例子:

    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 等。它是资源的完整地址,因此两个视图都知道如何解决它。

    【讨论】:

    • 哪里说 UIWebView 已弃用?
    • 它没有说“已弃用”,只是“使用 WKWebView 类而不是使用 UIWebView”。并且源代码没有被标记为已弃用或带有警告。他们没有提供更多细节,所以我不清楚。
    • 到目前为止,UIWebView 类引用中没有任何提及,但刚才我在 Xcode 9 beta 6 中看到,在情节提要编辑器上列出所有 UI 组件的地方,UIWebView 已弃用。
    • 这里的挑战是 WKWebView 中的数据检测器似乎只支持 iOS 10+,这对我们的用户群来说是个问题。任何人都有办法坚持使用 WKWebView 并在 iOS 9 中检测链接?
    • 为了澄清上述cmets中的时间线:在jjxtra发帖的时候,documentation的顶部有一条注释指示开发者不要将它用于iOS8+应用程序的UIWebView。这并不构成明确的弃用,尽管出于开发人员决策的目的,我建议将此类注释视为弃用;它仍然是官方建议。另一方面,现在它已被明确标记为已弃用。
    【解决方案2】:

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

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

    注意

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

    【讨论】:

      猜你喜欢
      • 2017-03-22
      • 2018-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-29
      • 2018-02-20
      • 2013-12-02
      相关资源
      最近更新 更多