В чем разница между 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 (string: realPath) для локального ресурса? Но почему UIWebView может использовать его ?

2 ответов


пара моментов:

  1. Apple рекомендует что вы используете WKWebview для iOS 8 и более поздних версий. Я бы избегал написания нового кода с помощью UIWebView.

в приложениях, работающих в iOS 8 и более поздних версиях, используйте WKWebView класс вместо того, чтобы использовать UIWebView. Кроме того, рассмотрите возможность установки WKPreferences свойства javaScriptEnabled to false если вы визуализируете файлы, которые не должны запускать JavaScript.

  1. Apple была пытаюсь отойти от путь и вместо этого хочет использовать URI даже для локальных файлов. Они рекомендуют не использовать /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://), который сообщает, что ресурс находится в локальной файловой системе. Другие распространенные схемы http, https, ftp, etc. Это полный адрес ресурса, поэтому оба представления знают, как его разрешить.

Это может быть по соображениям безопасности, или просто как WKWebView API был реализован.

WKWebView имеет конкретный метод экземпляра для загрузки локальных ресурсов с именем loadFileURL(_:allowingReadAccessTo:). Это было введено в iOS 9.

Примечание

если вы ориентируетесь на iOS 8.0 или новее, вы должны использовать WKWebView вместо UIWebView. Смотри:https://developer.apple.com/reference/webkit/wkwebview