Какая разница между 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
Пара точек:
-
UIWebView
устарел. Не пишите с ним новый код.
- 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
-
url
не предоставляет схему (протокол a.k.a). Его следует использовать только в сочетании с другим URL-адресом, чтобы указать абсолютный адрес ресурса, который вы пытаетесь достичь. UIWebView
поддерживает его по соображениям обратной совместимости, но Apple решила начать очистку с помощью WKWebView
.
-
fileURL
имеет схему (file://
), которая сообщает, что ресурс находится в локальной файловой системе. Другие общие схемы: http
, https
, ftp
и т.д. Это полный адрес ресурса, поэтому оба представления знают, как его разрешить.
Ответ 2
Это может быть связано с соображениями безопасности или просто как API WKWebView
был реализован.
WKWebView
имеет специальный метод экземпляра для загрузки локальных ресурсов с именем loadFileURL(_:allowingReadAccessTo:)
. Это было введено в iOS 9.
Примечание
Если вы ориентируетесь на iOS 8.0 или новее, вы должны использовать WKWebView
вместо UIWebView
. См.: https://developer.apple.com/reference/webkit/wkwebview