UIWebView y NSURLCache tienen una relación conflictiva
-
21-09-2019 - |
Pregunta
Estoy tratando de resolver 2 cosas en mi UIWebView
:
- Carga de elementos locales en lugar de las remotas, en las condiciones correctas
- activos remotos de carga de forma normal si no hay las locales o son obsoletos
- 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.
-
UIWebView
ignora la cabecera servidoresCache-Control
para el contenido HTML -
UIWebView
pide unNSCachedURLResponse
de la solicitud principal de HTML, pero entonces se ignora y se desecha. -
UIWebView
pide alNSURLCache
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?
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?