Можно ли кешировать ресурсы, загруженные в iPhone UIWebView? - PullRequest
11 голосов
/ 06 декабря 2008

У меня есть простое приложение, загружающее сайт, оптимизированный для iPhone, в UIWebView.

Проблема в том, что кэширование не работает:

[webView loadRequest: [NSURLRequest requestWithURL: [NSURL URLWithString: url]
                                       cachePolicy: NSURLRequestUseProtocolCachePolicy
                                   timeoutInterval: 60.0]];

Все объекты, на которые есть ссылки на этой удаленной странице (CSS, изображения, внешние файлы javascript), никогда не кэшируются (запросы никогда не отправляют заголовок If-Modified-Since или что-либо еще в плане управления кэшем.)

Возможно ли это? Кажется, в обычном Cocoa WebView есть методы делегатов, которые вызываются для каждого запроса ресурса и последующей загрузки (-didFinishLoadingFromDataSource:), которые вы можете использовать для прокрутки собственного кэширования ... но здесь это не применимо.

Вся моя страница (страница и ссылочные ресурсы) сжата примерно на 89 тыс., Что в некоторых местах медленнее, чем 3G, и даже хуже, чем EDGE. Входящие запросы по крайней мере указывают на то, что он принимает сжатие (accept-encoding=gzip, deflate), так что это хорошо, я полагаю.

Я прочитал это исследование yui , которое, кажется, указывает на то, что iPhone будет кэшировать 25 КБ на элемент. Единственное упоминание о том, что более 25 тыс. Несжатых файлов - это jquery (упакованный, но несжатый - 30 тыс.). Все остальное должно быть кешируемым. Ни один запрос на что-либо, на что есть ссылка в извлеченной странице, не вызывает 304 на стороне сервера.

Это исследование было почти год назад, и я думаю, только с мобильным сафари.

Используется UIWebView в родном приложении для iPhone.

Ответы [ 6 ]

7 голосов
/ 28 июля 2009

Один из способов решения этой проблемы -

1) скачать HTML код

2) сохранить в строке

3) найти все внешние ссылки в нем как

<img src="img.gif" width="..." height="..." />

4) скачать их все

5) заменить их встроенной версией в кодировке Base64

<img src="data:image/gif;base64,R0lGODlhUAAPA...JADs= " width="..." height="..." />

6) наконец, сохраните полный HTML-код со встроенными изображениями.

5 голосов
/ 11 июля 2011

С https://github.com/phonegap/phonegap-iphone/issues/148:

NSURLCache* cache = [NSURLCache sharedURLCache];
[cache setMemoryCapacity:4 * 1024 * 1024];
[cache setDiskCapacity:512*1024];

[NSURLRequest requestWithURL:appURL
                 cachePolicy:NSURLRequestReturnCacheDataElseLoad
             timeoutInterval:10.0];
4 голосов
/ 06 августа 2010

Теперь вы можете попробовать ASIWebPageRequest от All Seeing Interactive:

ASIWebPageRequest - это новое экспериментальное дополнение к семейству ASIHTTPRequest. Его можно использовать для загрузки полной веб-страницы, включая внешние ресурсы, такие как изображения и таблицы стилей, в одном запросе. После загрузки веб-страницы запрос проанализирует содержимое, выполнит поиск внешних ресурсов, загрузит их и вставит их непосредственно в источник html с помощью Data URIS. Затем вы можете взять ответ и поместить его непосредственно в UIWebView / WebView на Mac.

В любом случае, я могу только посоветовать всем использовать великолепную библиотеку Бена Копси для всех видов HTTP-операций.

ОБНОВЛЕНИЕ : Бен прервал запрос ASIHTTP. Я больше не предлагаю использовать его.

2 голосов
/ 22 декабря 2008

Вы всегда можете выполнить запросы вручную, хотя это будет сложно - и тогда вы сможете кэшировать вещи в соответствии с вашими пожеланиями. Создайте UIWebViewDelegate, который запускает запрос в webView:shouldStartLoadWithRequest:navigationType:, кэшируйте результат и используйте UIWebView loadHTMLString:baseURL: для обновления представления.

Это будет некрасиво, и все будет работать не так гладко, как хотелось бы, но может быть достаточно для того, что вам нужно.

1 голос
/ 06 декабря 2008

Ihone имеет ограниченную емкость кэширования по сравнению с обычным компьютером. Это ограничивает несжатых элементов кэша 25k.

Хорошая информация здесь: http://yuiblog.com/blog/2008/02/06/iphone-cacheability/

0 голосов
/ 17 октября 2012

У вас должна быть возможность создать подкласс NSURLCache и заменить его общим кэшем, используемым UIWebView, как описано в этой статье «Какао с любовью»: Подстановка локальных данных для удаленных запросов UIWebView

Для другого подхода взгляните на Автономное кэширование для UIWebView (и NSURLProtocol) .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...