¿Es posible almacenar en caching los resources cargados en un iPhone UIWebView?

Tengo una aplicación simple cargando un sitio optimizado para el iPhone en una UIWebView .

El problema es que el almacenamiento en caching no parece funcionar:

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

Cualquier cosa a la que se hace reference en esta página remota (css, imágenes, files javascript externos) nunca se almacena en caching (las requestes nunca envían un encabezado de If-Modified-Since o cualquier otra cosa en el control de caching).

¿Es posible? Parece con un Cocoa WebView regular allí un método de delegado que recibe una llamada para cada request de recurso y carga de publicación ( -didFinishLoadingFromDataSource: que podría usar para -didFinishLoadingFromDataSource: su propio almacenamiento en caching … pero eso no parece aplicable aquí.

Toda mi página (página y sus resources a los que se hace reference) es de alnetworkingedor de 89K comprimidos … lo cual es lento en 3G en algunos puntos e incluso peor en EDGE. Las requestes entrantes indican al less que acepta la compression ( accept-encoding=gzip, deflate ), así que eso es bueno, supongo.

Leí este estudio yui , que parece indicar que el iPhone almacenará en caching 25k por artículo. Lo único referencedo que es más de 25k sin comprimir es jquery (empaquetado pero sin comprimir, es 30k). Todo lo demás debería ser cacheable. Ninguna request de cualquier reference en la página obtenida está desencadenando un 304 en el lado del server.

Ese estudio de Yui fue hace casi un año y supongo que solo con safari mobile.

Esto está utilizando un UIWebView en una aplicación de iPhone nativa.

Una solución de este problema como veo es

1) descarga el código HTML

2) guárdelo en la string

3) encontrar todos los enlaces externos en él como

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

4) downloadlos todos

5) replacelos con la versión codificada Base64 incorporada

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

6) finalmente almacene HTML completo con imágenes incrustadas como desee.

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

 NSURLCache* cache = [NSURLCache shanetworkingURLCache]; [cache setMemoryCapacity:4 * 1024 * 1024]; [cache setDiskCapacity:512*1024]; [NSURLRequest requestWithURL:appURL cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:10.0]; 

Ahora puedes probar ASIWebPageRequest de All Seeing Interactive:

ASIWebPageRequest es una nueva adición experimental a la familia ASIHTTPRequest. Se puede usar para download una página web completa, que incluye resources externos como imágenes y hojas de estilo, en una sola request. Una vez que se descarga una página web, la request analizará el contenido, searchá resources externos, los downloadá e insertá directamente en la fuente html usando Data URIS. A continuación, puede tomar la respuesta y colocarla directamente en un UIWebView / WebView en Mac.

Solo puedo aconsejarles a todos que utilicen la gran biblioteca de Ben Copsey para todo tipo de operaciones HTTP de todos modos.

ACTUALIZACIÓN : Ben ha descontinuado ASIHTTPRequest. Ya no sugiero usarla.

Siempre puede realizar las requestes manualmente, aunque eso será complicado, y luego puede almacenar en caching las cosas en el contenido de su corazón. Cree un UIWebViewDelegate que inicie la request en webView:shouldStartLoadWithRequest:navigationType: el resultado en caching y use loadHTMLString de loadHTMLString:baseURL: para actualizar la vista.

Será feo, y las cosas no funcionarán tan bien como lo desee, pero puede ser lo suficientemente bueno para lo que necesita.

El ihone tiene una capacidad de caching limitada en comparación con una computadora normal. Limita los elementos de caching sin comprimir a 25k.

Buena información aquí: http://yuiblog.com/blog/2008/02/06/iphone-cacheability/

Debería poder subclass NSURLCache y sustituirlo por el caching compartido utilizado por UIWebView como se describe en este artículo de Cocoa with Love: Sustitución de datos locales para requestes remotas de UIWebView

Para otro enfoque, observe el caching sin connection Drop-in para UIWebView (y NSURLProtocol) .