В приложениях, запущенных в iOS 8 и более поздних версиях, используйте класс WKWebView вместо использования UIWebView.
Таким образом, я заменил старый добрый UIWebView
блестящим новым WKWebView
. Но то, что я считал простым упражнением (просто заменяя классы и заменяя методы делегата), оказалось настоящим беспорядком.
Проблема
Когда я загружаю HTML-строку, используя
loadHTMLString(String, baseURL: URL?)
веб-просмотр загружает и отображает чистый HTML, но он не загружает изображения или файлы CSS, на которые ссылаются внутри htmlString
.
Это происходит только на реальном устройстве!
В Simultor все ресурсы, на которые ссылаются, загружаются правильно.
Пример
Я определил простой htmlString
в моем классе контроллера:
let imageName = "image.png"
let libraryURL: URL // The default Library URL
var htmlString: String {
return "<html> ... <img src=\"\(imageName)\" /> ... </html>"
// "..." represents more valid HTML code incl. header and body tags
}
Изображение сохраняется в корневой папке библиотеки, поэтому его URL-адрес:
let imageURL = libraryURL.appendingPathComponent(imageName)
Теперь я загружаю htmlString
в веб-представление:
webView.loadHTMLString(htmlString, baseURL: libraryURL)
и не загружает изображение, даже если baseURL
установлен правильно.
Идеи для решения
-
Возможно,
WKWebView
имеет проблему с решением относительных путей, поэтому моя первая идея заключалась в использовании абсолютных путей внутри строки HTML.
→ ❌ Не работает. -
Два ответа на другое сообщение SO предполагали, что использование
loadFileURL(URL, allowingReadAccessTo: URL)
вместоloadHTMLString(...)
работает в iOS 9+.
→ ✅ Это работает.
Однако я не могу использовать решение 2, потому что мои файлы HTML зашифрованы, а дешифрованные файлы не должны храниться на диске.
Вопрос
Есть ли способ загрузить локальные ресурсы, такие как изображения и стили, с помощью WKWebView
'
loadHTMLString(String, baseURL: URL?)
функция? Или все еще ошибка в iOS 9 +?
(Я просто не могу поверить, что Apple предоставляет и рекомендует использовать веб-представление, которое не может загрузить какой-либо локальный веб-контент изнутри строки HTML!)