UIWebView и NSURLCache имеют проблемные отношения - PullRequest
4 голосов
/ 19 января 2010

Я пытаюсь решить 2 вещи в моем UIWebView:

  1. Загружать локальные активы вместо удаленных, в правильных условиях
  2. Загружать удаленные активы как обычно, если локальных нет или они устарели
  3. Разрешить веб-просмотру возвращаться назад без необходимости перезагружать его 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 есть несколько ошибок.

  1. UIWebView игнорирует серверы Cache-Control заголовок для содержимого HTML
  2. UIWebView запрашивает NSCachedURLResponse для основного запроса HTML, но затем игнорируется и отбрасывается.
  3. UIWebView запрашивает NSURLCache ресурсы, если вы загружаете его с помощью запроса, но при загрузке с HTML или данными он полностью обходит кэш и запрашивает его непосредственно с удаленного сервера.

Итак, во-первых, кто-нибудь видит решение этих проблем? И во-вторых, есть ли причина, по которой я глуп, и на самом деле это не ошибки SDK?

Ответы [ 2 ]

1 голос
/ 20 января 2010

Я отказался от этого. Было слишком много ошибок. Вместо этого я просто загружаю новую страницу через ajax. И вместо [webview goBack] у меня есть какой-то пользовательский javascript, чтобы сделать для меня классные вещи на [webview stringByEvaluatingJavascriptFromString:@"goBack()"]

1 голос
/ 20 января 2010

Для решения вашего первого # 3:

Хотя это может показаться немного неортодоксальным, но как насчет сохранения загруженного HTML-объекта в объект NSUserDefaults в виде плоской строки и восстановления его (условно) позднее, когда вам это нужно?

...