2008-12-05 11 views
11

Tengo una aplicación simple cargando un sitio optimizado para el iPhone en un UIWebView.¿Es posible almacenar en caché los recursos cargados en un UIWebView de iPhone?

El problema es que no parece almacenamiento en caché para trabajar:

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

Cualquier cosas que se hace referencia en esta página remota (CSS, imágenes, archivos javascript externos) nunca se caché (las peticiones nunca envían a Si-Modified- Desde el encabezado o cualquier otra cosa en el camino de control de caché.)

¿Es posible? Parece que con un Cocoa WebView normal hay métodos de delegado a los que se llama para cada solicitud de recursos y post carga (-didFinishLoadingFromDataSource:) que puede usar para rodar su propio almacenamiento en caché ... pero eso no parece aplicable aquí.

Toda mi página (la página y los recursos a los que se hace referencia) tiene unos 89K comprimidos ... que es lento en 3G en algunos puntos y aún peor en EDGE. Las solicitudes entrantes indican al menos que acepta la compresión (accept-encoding=gzip, deflate), así que eso es bueno, supongo.

Leo this yui study, lo que parece indicar que el iPhone almacenará en caché 25k por artículo. La única referencia que tiene más de 25k sin comprimir es jquery (empaquetado pero sin comprimir, es 30k). Todo lo demás debe ser almacenable en caché. Ninguna solicitud de ningún elemento al que se haga referencia en la página recuperada está activando un 304 en el lado del servidor.

Ese estudio yui fue hace casi un año, y supongo que solo con safari móvil.

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

Respuesta

2

Siempre se puede realizar manualmente las solicitudes, sin embargo, que va a ser complicado - y luego se puede almacenar en caché las cosas a su gusto. Cree un UIWebViewDelegate que inicie la solicitud en webView:shouldStartLoadWithRequest:navigationType:, guarde en caché el resultado y use el loadHTMLString:baseURL: de UIWebView para actualizar la vista.

Va a ser feo, y las cosas no funcionarán tan bien como podría desear, pero puede ser lo suficientemente bueno para lo que necesita.

7

Una solución de este problema que veo es a

1) descargar código HTML

2) almacenarla en la cadena

3) encontrar todos los enlaces externos en ella como

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

4) Descárguelos todos

5) Reemplázalos con Base incrustada Versión 64-codificada

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

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

+10

Genio, aunque bastante inquietante. –

+0

La mejor manera de hacerlo mal. Hombre, estamos buscando aquí al menos una solución más útil –

+0

@ eagle.dan.1349 ¿por qué es la mejor manera de hacerlo mal? en ausencia de "una solución un poco más práctica" esta * es * la solución más útil – abbood

4

Ahora puede probar ASIWebPageRequest por All Seeing Interactivo:

ASIWebPageRequest es una nueva adición a la familia experimental ASIHTTPRequest. Se puede usar para descargar una página web completa, incluidos recursos externos, como imágenes y hojas de estilo, en una sola solicitud. Una vez que se descarga una página web, la solicitud analizará el contenido, buscará recursos externos, los descargará e insertará directamente en la fuente html utilizando Data URIS. A continuación, puede tomar la respuesta y colocarla directamente en UIWebView/WebView en Mac.

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

ACTUALIZACIÓN: Ben ha suspendido ASIHTTPRequest. Ya no sugiero usarlo.

+0

Hola @rage, ¿puedes sugerir alguna alternativa a ASIWebPageRequest? –

+0

AFNetworking es bastante bueno. También MKNetworking. El público en general aún no ha decidido cuál va a ser el próximo estándar de facto. No estoy seguro de si alguno de ellos admite la descarga completa de páginas web. – rage

+0

Gracias @rage. Uso AFNetworking para mis llamadas de API, pero no para la descarga/almacenamiento en caché completo de páginas web. Estoy escribiendo una aplicación de contenedor que alberga una aplicación web Backbone dentro de UIWebview y estoy buscando formas de que se cargue más rápido. –

5

De 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]; 
+0

Creo que el enlace está roto –

Cuestiones relacionadas