Pregunta

Estoy tratando de resolver 2 cosas en mi UIWebView:

  1. Carga de elementos locales en lugar de las remotas, en las condiciones correctas
  2. activos remotos de carga de forma normal si no hay las locales o son obsoletos
  3. Permita que la vista web para ir "hacia atrás", sin necesidad de recargar su forma HTML al servidor

Así que para manejar # 1 y # 2, he implementado un NSURLCache subclase personalizada. Que se llama cuando la vista web solicita activos, y puede enviar a lo largo de los locales en su lugar, abortar la llamada al servidor para el activo. Incluso tengo un sistema de sellado de tiempo poco lo que sabe si la versión local es viejo o no de averiguar cuál de ellos utilizar.

Sin embargo, # 3 me está tirando para un bucle. Parece que, independientemente de las cabeceras de control de caché, UIWebView SIEMPRE volverá a cargar el código HTML cuando vamos a volver.

Así que trataron de forzar el almacenamiento en caché del HTML en mi clase NSURLCache personalizado. Parece que funciona, y devuelve la instancia de NSCachedURLResponse con el código HTML que quiero, pero el UIWebView no se da cuenta y lo carga desde el servidor de todos modos. Después de buscar Veo que hay algunos "inconsistencias" con UIWebView y la caché url, y creo que este es uno. Funciona muy bien para los activos, pero no tan grande para el código HTML que compone la página que está tratando de mostrar.

Así que decidí que ya no puede trabajar, hacerlo de forma manual. He creado una pila de direcciones URL, y los datos que voy a buscar manualmente y cargar con loadData:MIMEType:textEncodingName:baseURL:. Pero hete aquí que parece que ha funcionado muy bien! Ahora podía volver atrás, la vista web delegado podría interceptar la carga, y decirle que cargue mis datos manualmente en lugar inverosímil, y el servidor no se verían afectados.

Sin embargo, luego me di cuenta de que el NSURLCache ya no estaba siendo utilizado para mis activos. Parece que sólo pide activos en caché si se carga el contenido con loadRequest: y no por la carga de datos o una cadena HTML con el baseUrl configurar correctamente.

Así que a pesar de todos mis esfuerzos no puedo hacer una vista web cargar condicionalmente activos locales y navegar hacia atrás sin golpear el servidor. Parece como si tuviera algunos errores aquí en el SDK.

  1. UIWebView ignora la cabecera servidores Cache-Control para el contenido HTML
  2. UIWebView pide un NSCachedURLResponse de la solicitud principal de HTML, pero entonces se ignora y se desecha.
  3. UIWebView pide al NSURLCache de bienes si se carga con una petición, pero cuando se carga con HTML o datos que no pasa por el caché por completo y le pide que directamente desde el servidor remoto.

Así que por primera vez, que nadie vea una solución a esto? Y en segundo lugar, ninguna razón por la que estoy siendo estúpido y estos no son realmente errores SDK?

¿Fue útil?

Solución 2

He abandonado esto. Había demasiadas trampas. En lugar de eso sólo tiene que cargar nueva página en medio de Ajax. Y en lugar de [webview goBack] tengo alguna costumbre javascript para hacer cosas interesantes para mí en [webview stringByEvaluatingJavascriptFromString:@"goBack()"]

Otros consejos

Para hacer frente a su primer # 3:

Si bien puede parecer poco ortodoxo, ¿qué hay que persiste el HTML descargado a un objeto NSUserDefaults como una cadena plana, y su restauración (condicional) más tarde cuando lo necesite?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top