В чем разница между 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 ответов
пара моментов:
- Apple рекомендует что вы используете
WKWebview
для iOS 8 и более поздних версий. Я бы избегал написания нового кода с помощьюUIWebView
.
в приложениях, работающих в iOS 8 и более поздних версиях, используйте
WKWebView
класс вместо того, чтобы использоватьUIWebView
. Кроме того, рассмотрите возможность установкиWKPreferences
свойстваjavaScriptEnabled
tofalse
если вы визуализируете файлы, которые не должны запускать JavaScript.
- 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