tutorial open ios iphone cocoa-touch caching uiwebview

ios - open - web view swift 4



¿Es posible almacenar en caché los recursos cargados en un UIWebView de iPhone? (6)

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

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

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

El problema es que el almacenamiento en caché no parece funcionar:

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

Las cosas a las que se hace referencia en esta página remota (css, imágenes, archivos javascript externos) nunca se almacenan en caché (las solicitudes nunca envían un encabezado If-Modified-Since o cualquier otra cosa en el camino del 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 carga posterior ( -didFinishLoadingFromDataSource: que puede usar para desplegar 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 89.000 comprimidos ... que es lento en 3G en algunos puntos e incluso peor en EDGE. Las solicitudes entrantes indican al menos que acepta compresión ( accept-encoding=gzip, deflate ), así que eso es bueno, supongo.

Leí este estudio yui , 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 de Yui fue de hace casi un año, y supongo que solo con safari móvil.

Esto es usando UIWebView en una aplicación nativa de iPhone.


Una solución de este problema como veo es

1) descarga el código HTML

2) almacenarlo en la cadena

3) encuentre todos los enlaces externos en él como

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

4) descargarlos a todos

5) reemplázalos con la versión incrustada Base64-encoded

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

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


Desde 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];


Siempre puedes realizar las solicitudes de forma manual, aunque eso será complicado, y luego puedes guardar las cosas en el contenido de tu corazón. Cree un UIWebViewDelegate que inicie la solicitud en webView:shouldStartLoadWithRequest:navigationType: caché el resultado y use loadHTMLString:baseURL: para actualizar la vista.

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


Ahora puede probar ASIWebPageRequest por All Seeing Interactive:

ASIWebPageRequest es una nueva adición experimental a la familia 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.