Я пытаюсь решить 2 вещи в моем UIWebView
:
- Загружать локальные активы вместо удаленных, в правильных условиях
- Загружать удаленные активы как обычно, если локальных нет или они устарели
- Разрешить веб-просмотру возвращаться назад без необходимости перезагружать его html с сервера.
Итак, для обработки # 1 и # 2 я реализовал пользовательский подкласс NSURLCache
. Он вызывается, когда веб-просмотр запрашивает ресурсы, и я могу вместо этого отправлять локальные, прерывая серверный вызов для ресурса. У меня даже есть небольшая система меток времени, которая знает, является ли локальная версия старой или нет, чтобы выяснить, какую из них использовать.
Но № 3 бросает меня за петлю. Похоже, что независимо от заголовков управления кэшем, UIWebView
будет ВСЕГДА перезагружать HTML при возврате.
Поэтому я попытался принудительно кэшировать HTML в своем пользовательском NSURLCache
классе. Кажется, он работает и возвращает экземпляр NSCachedURLResponse
с нужным мне HTML, но UIWebView
не замечает и все равно загружает его с сервера. После некоторого поиска я вижу, что есть некоторые "несоответствия" с UIWebView
и кешем URL, и я думаю, что это одно. Прекрасно работает с активами, но не так хорошо с HTML, который составляет страницу, которую он пытается отобразить.
Тогда я решил, что, так как это может не сработать, сделайте это вручную. Я создал стек URL-адресов и их данные, которые я извлекаю вручную и загружаю с помощью loadData:MIMEType:textEncodingName:baseURL:
. И вот, кажется, это прекрасно работает! Теперь я могу вернуться, делегат веб-представления перехватит загрузку и скажет ему загрузить вместо этого мои вручную извлеченные данные, и сервер не будет поражен.
Однако затем я заметил, что NSURLCache больше не используется для моих активов. Кажется, он запрашивает кэшированные ресурсы только в том случае, если вы загружаете контент с помощью loadRequest:
, а не путем загрузки данных или HTML-строки с baseUrl
, установленным правильно.
Таким образом, несмотря на все мои усилия, я не могу сделать веб-просмотр условно загружать локальные ресурсы и вернуться обратно, не обращаясь к серверу. Кажется, у меня в SDK есть несколько ошибок.
UIWebView
игнорирует серверы Cache-Control
заголовок для содержимого HTML
UIWebView
запрашивает NSCachedURLResponse
для основного запроса HTML, но затем игнорируется и отбрасывается.
UIWebView
запрашивает NSURLCache
ресурсы, если вы загружаете его с помощью запроса, но при загрузке с HTML или данными он полностью обходит кэш и запрашивает его непосредственно с удаленного сервера.
Итак, во-первых, кто-нибудь видит решение этих проблем? И во-вторых, есть ли причина, по которой я глуп, и на самом деле это не ошибки SDK?