стриж

аюсь заставить WKWebView отображать локально загруженные изображения вWKWebView, Веб-просмотр обычно отображает HTML, который извлекается удаленно. Содержимое HTML иногда может содержать удаленные ссылки на изображения. Мое приложение анализирует HTML-код и ищет эти HTML-теги, загружает файл, на который ссылается, и впоследствии заменяет удаленную ссылку локальной.

Обычно это не очень сложно, но изображения не отображаются, возможно, из-за того, что изображения и локальные HTML-файлы для веб-просмотра находятся в двух отдельных каталогах (каталог документов и каталог комплекта приложений соответственно). Я видел, как люди предлагали перенести место загрузки изображений в тот же каталог, где находятся файлы HTML, но это не вариант для меня, так как я не хочу начинать смешивать файлы, загруженные пользователем, с локальными ресурсами ,

Какой мой лучший курс действий здесь?

 Wes18 сент. 2017 г., 23:20
Хорошо, я столкнулся с этой же проблемой раньше. В идеале вы должны убедиться, что каталог, содержащий HTML, и каталог, содержащий изображения, имеют общий каталог предков. Во-вторых, убедитесь, что ваши ссылки img в файле HTML отражают собственные пути к файлам, которые вы создали после загрузки. Наконец, когда вы загружаете HTML-страницу, убедитесь, что вы используетеloadFileURL(_:allowingReadAccessTo:) где каталог, к которому разрешен доступ, является общим корневым каталогом, которым совместно пользуются HTML и изображения.
 Anubis18 сент. 2017 г., 21:14
@Wes Это последнее.
 Wes18 сент. 2017 г., 17:38
Изображения отображаются сами по себе или в контексте загруженной страницы? Оба экземпляра требуют разных решений.
 Thomas Elliot25 сент. 2017 г., 01:40
Пожалуйста, смотрите мой ответ для более обширного решения.
 Anubis19 сент. 2017 г., 10:05
@ Wes Разве я не пытаюсь избежать такой ситуации, как я описал в ОП? Потому что для этого нужно либо сохранить ресурсы моего приложения (файлы javascript, которые получают данные, которые я получаю удаленно) в папке документов, либо сохранить загруженные файлы в пакет приложения (это вообще возможно?). В любом случае, я бы смешивал ресурсы приложения с пользовательскими данными, которые кажутся действительно грязными.

Ответы на вопрос(2)

WKWebView:

Для каждого из ресурсов в вашей строке содержимого HTML, кэшируйте его в каталог, предоставленныйNSTemporaryDirectory(), Таким образом, тег изображения, как:

...<img src='https://www.myimage.com/example_image.png'/>...

следует кэшировать и заменить на что-то вроде этого:

...<img src='/private/var/mobile/Containers/Data/Application/527CF4FC-9319-4DFF-AB55-9E276890F5DC/tmp/example_image.png'/>...

Теперь кэшируйте строку содержимого HTML с замененными URL-адресами ресурсов. Он также должен быть кэширован в каталоге, предоставленномNSTemporaryDirectory(), Одно из различий заключается в том, что он должен кэшироваться (и на него можно ссылаться)file:// протокол как ограничение кэширования строки с использованиемNSData (см. пример кода).

Напримерfile:///private/var/mobile/Containers/Data/Application/527CF4FC-9319-4DFF-AB55-9E276890F5DC/tmp/my_html_content_string.html

Несколько вещей, на которые стоит обратить внимание:

Вы не можете загрузить HTML как необработанную строку (loadHTMLString:baseURL:).Вы не можете ссылаться на кэшированный ресурс в вашей HTML-строке, используяfile:// протокол. Это может работать вUIWebView, но не будет работать вWKWebView.

Objective-C

// To cache the HTML string:
NSString *HTML = <HTML CONTENT WITH CACHED RESOURCES>;
NSData *data = [HTML dataUsingEncoding: NSUTF8StringEncoding];
[data writeToURL: cachedHTMLURL atomically: YES];

// To load the store HTML file:
[myWKWebView loadRequest: [NSURLRequest requestWithURL: cachedHTMLURL]]; // (file://.../tmp/my_html_content_string.html)

стриж

// To cache the HTML string:
let HTML = <HTML CONTENT WITH CACHED RESOURCES>
let data = HTML.data(using: String.Encoding.utf8)
do {
    try data.write(to: cachedHTMLURL, options: .atomic)
} catch {
    print(error)
}

// To load the store HTML file:
myWKWebView.load(URLRequest(url: cachedHTMLURL)) // (file://.../tmp/my_html_content_string.html)

я нашел обходной путь. Вместо того, чтобы локально хранить изображения и ссылаться на них в файлах HTML, я вместо этого преобразовываю изображения в Base64, а затем добавляю их в HTML. Это не идеально, но это делает работу. Я оставлю этот вопрос открытым, если кому-то удастся найти реальное решение.

 Chris16 янв. 2019 г., 22:24
После долгих поисков в SO и в других местах, это то, чем я в конечном итоге и занимался. Работает красиво, но не идеально.

Ваш ответ на вопрос