2009-10-08 20 views
19

Me gustaría poder usar el manifiesto de memoria caché html5 para almacenar imágenes localmente en un iPhone que está visitando la página a través de UIWebView dentro de una aplicación.manifiesto de memoria caché Html5 en un UIWebView?

He configurado una muestra que creo que cumple con las especificaciones, y parece funcionar en Safari 4 y Safari móvil, pero no en mi aplicación UIWebView.

La muestra html está configurada en http://bynomial.com/html5/clock3.html.

Esto es muy similar a la muestra proporcionada en el HTML5 draft standard.

Aquí está el código completo (sin plantilla) de la aplicación de ejemplo que estoy usando para la prueba:

- (void)applicationDidFinishLaunching:(UIApplication *)application {  

    // I thought this might help - I don't see any difference, though. 
    NSURLCache* cache = [NSURLCache sharedURLCache]; 
    [cache setDiskCapacity:512*1024]; 

    CGRect frame = [[UIScreen mainScreen] applicationFrame]; 
    UIWebView* webView = [[UIWebView alloc] initWithFrame:frame]; 
    [window addSubview:webView]; 

    NSString* urlString = @"http://bynomial.com/html5/clock3.html"; 
    NSURL* url = [NSURL URLWithString:urlString]; 
    NSURLRequest* request = [NSURLRequest requestWithURL:url]; 
    [webView loadRequest:request]; 

    [window makeKeyAndVisible]; 
} 

He revisado algunas preguntas relacionadas en stackoverflow, pero no parecen proporciona información para resolver esto. Por ejemplo, estoy bastante seguro de que los archivos que intento guardar en caché no son demasiado grandes, ya que son solo un par de pequeños archivos de texto (forma < 25k).

¿Alguna idea de cómo hacer que esto funcione?

+0

Tyler, La respuesta que elijas ya no es relevante. Debe actualizar su elección a la respuesta de @ iPixFolio si puede. –

+0

Funcionará iOS7 y 6. ¿Por qué no funciona en iOS 8? –

Respuesta

26

Lo hice funcionar usando un archivo .manifest en un UIWebView. Descubrí el truco en los foros de desarrolladores de Apple.

debe entregar el tipo de mime adecuado para el archivo de manifiesto: debe ser del tipo "texto/memoria caché"; si es otra cosa, no obtendrá sus archivos en caché.

puede utilizar web-sniffer en http://web-sniffer.net/ para ver los encabezados devueltos por su servidor.

si está utilizando archivos .htaccess en su servidor web, a continuación, añada la línea siguiente al archivo .htaccess:

AddType text/cache-manifest .manifest 

asegúrese de borrar la caché del navegador después de hacer este cambio para ver el efecto.

HTH Marcos

editar: esto sólo es compatible con iOS 4.0 y posterior. Usted tendrá que implementar su propio mecanismo de caché para iOS 2.x y 3.x :-(

+0

Muy bueno, pero necesitar iOS4 todavía es un factor decisivo para muchos desarrolladores. Pero un paso en la dirección correcta, seguro. –

+4

Sugerencia adicional para cualquier persona que busque: no necesita un sniffer web para esto. Simplemente inicie una sesión de terminal y emita esto: 'curl -I http: // YOUR_DOMAIN/PATH/TO/CACHE_MANIFEST' – Ben

+3

Ya no es un factor decisivo. –

3

Puede usar el parámetro cachePolicy en NSURLRequest.

request = [NSURLRequest requestWithURL:[NSURL URLWithString:reqString] cachePolicy:NSURLRequestReturnCacheDataDontLoad timeoutInterval: 10.0]; 

documentados here.

+0

Esto no funciona. Así es como sé: construí un archivo de muestra con un manifiesto de caché, y cargué este archivo en 3 navegadores: (1) Firefox (2) Safari móvil, (3) un UIWebView usando NSURLRequestReturnCacheElseLoad (si uso DontLoad, entonces _ nunca_ cargas). Luego modifico una imagen en caché en el servidor. Firefox y Safari muestran correctamente la imagen anterior; mi UIWebView obtiene la nueva imagen. – Tyler

+0

Lo tengo funcionando hoy (SDK 5). Gracias – Tiago

1

Ha intentado crear un objeto NSURLCache personalizada y utilizar el setSharedURLCache: método, como se recomienda en la documentación:

"Aplicaciones con necesidades más específicas pueden crear un objeto NSURLCache personalizada y configurarlo como la instancia de memoria caché compartida utilizando setSharedURLCache:"

+1

Sí, tengo. No hace que el manifiesto de caché funcione, aunque puede usar esa técnica para intentar crear su propia memoria caché, pero esto es más complicado de lo que parece, porque la estructura de NSURL rechaza algunas respuestas en caché por razones desconocidas. – Tyler

+0

He notado lo mismo. Es bastante quisquilloso. –

2

UIWebView 's no (no quiere o) puede utilizar el AppCache HTML5. Simplemente no lo hacen. Tal vez en iPhone OS 4.0.

Pero lo que puede hacer es buscar todos los archivos con llamadas de red (o simplemente tenerlos en su paquete de aplicaciones) y cargar la vista web con una URL local apuntando a su archivo HTML local, que puede tener URL relativas a activos locales.

Sin embargo, no hay una forma sencilla de "simplemente funciona" para que esto suceda.

+3

Después de mucho investigar, estoy de acuerdo en que simplemente no hay una manera fácil de resolver este problema. Lo más cercano que pude conseguir fue implementar mi propia subclase de NSURLCache y configurarla como caché. Sin embargo, incluso con todo eso, descubrí que a menudo mis resultados en caché eran rechazados por el sistema operativo por razones que eran opacas para mí. Parece que el sistema operativo es extremadamente exigente con la aceptación de respuestas en caché, sin importar qué política de caché u otros ajustes de parámetros haya intentado. Muy frustrante para trabajar! – Tyler

+0

La respuesta a continuación indica que esto puede funcionar en iOS 4.2 –

+0

Tengo este trabajo en iOS 5.0 –

1

que estaba experimentando el mismo problema Aunque he utilizado:.

[NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:30.0]; 

no parecía querer utilizar los datos almacenados en caché. lo que significa que constantemente hizo la solicitud a mi servicio web para recuperar el contenido más reciente y por lo tanto hizo el almacenamiento en caché inútil.


he encontrado una solución temporal. al cargar la URL en el UIWebView utilice el código siguiente:

NSString *html = [NSString stringWithFormat:@"<html><head><script type=\"text/javascript\">location.href='%@';</script></head><body></body></html>", [[currentURLRequest URL] absoluteString]]; 
[self.webView loadHTMLString:html baseURL:nil]; 

Esto se ha probado en el sistema operativo 4.2, ya que utilizo el manifiesto para manejar el almacenamiento en caché (HTML5). Existe una gran posibilidad de que no funcione en OS 2.x/3.x, esto debe confirmarse.

Las desventajas sobre el uso de este método es que no puede enviar ningún dato de POST con su solicitud.

Espero que esto ayude a cualquiera.


usted todavía tiene que enviar la solicitud con 'cachepolicy: NSURLRequestReturnCacheDataElseLoad' cosa que todavía no va a funcionar.

+0

¿Qué necesitaría hacer si estoy cargando un UIWebView desde un cuerpo html generado previamente NSString que se refiere a los archivos que necesito en la memoria caché? Básicamente, ¿supongo que puede ser una llamada Java diferente? ¿Algunas ideas? – Marius

Cuestiones relacionadas