2011-01-24 18 views
13

Tengo problemas para cargar HTML personalizado en mi UIWebView sin romper su método goBack.¿Se puede interceptar las solicitudes NSURL en un UIWebView sin romper el botón Atrás?

lo que funciona

estoy interceptando las peticiones de URL de mi UIWebView por lo que puede cargar HTML personalizado. Tengo control sobre todo el HTML, así que tengo mis solicitudes de aplicaciones especiales que usan un esquema personalizado (es decir, myapp://arg1/?arg2=val) que puedo analizar en webView:shouldStartLoadWithRequest:navigationType:. Decido qué HTML realmente quiero cargar y llamo al loadHTMLString:baseURL y devuelvo NO para cancelar la solicitud original.

lo que no funciona

Los trabajos anteriores grandes. El problema es que quiero utilizar el método UIWebView'sgoBack y loadRequest: parece ser el único método UIWebView que se agrega a su pila de historial.

Tengo algunas ideas, pero no estoy seguro de cuáles son factibles y cómo abordarlas. Lo principal parece ser que tengo que devolver YES en webView:shouldStartLoadWithRequest:navigationType y tengo que usar el método loadRequest.

Idea 1: Modificar NSURLRequest/Respuesta: ¿Puedo subclase NSURLRequest modo que (cuando el UIWebView hace la solicitud) que en realidad no hacen una petición HTTP y devuelve un NSURLResponse con mi HTML en ella? ¿O tal vez modificar/subclase/agregar un método de categoría a NSURLResponse de alguna manera? Me gusta la idea de que sea una solicitud real, pero me preocupan las API privadas y el rechazo de la App Store.

Idea 2: manejar el protocolo URL personalizada Registra un protocolo URL personalizada para que mi aplicación responde a la misma y que puede tener que devolver un NSURLResponse legítima

Idea 3 (lleno de mi HTML personalizada.) : Engañar a la caché Crear la solicitud con esta política de caché NSURLRequestReturnCacheDataDontLoad y de alguna manera obtener mi HTML entre WebView y la caché?

¿O tal vez estoy en el camino equivocado por completo?

+1

se le ocurrió una buena solución? Si es así, ¿qué fue? –

+0

Ver mi nueva respuesta. – zekel

Respuesta

1

Recomendaría en contra de cualquiera de los enfoques anteriores.

Obtuve el # 3 funcionando, pero era muy, muy frágil y difícil de depurar. (Por ejemplo, Apple destruye y vuelve a crear NSURLRequests, por lo que no puede simplemente subclasificar NSURLRequest y esperar que aparezca en la respuesta siguiente.)

Terminó siendo (mucho) más fácil para mi propio historial y nota qué página cargar y posición de desplazamiento (desplazamiento de la pantalla vertical).

+0

Gracias por responder. Decidí probar la sugerencia de caché local de Cocoa with Love sugerida por Ortwin. Hasta ahora parece estar haciendo lo que necesito y parece ser bastante robusto. –

7

Existe otro enfoque muy inteligente que acabo probado a cabo: En lugar de juguetear con el NSURLCache o volver a escribir todo el código de la historia de la navegación, basta con crear una costumbre NSURLProtocol que es utilizado por el estándar NSURLConnection siempre que se hace una petición HTTP.Allí, crea su propio NSURLRequest para cargar los datos y puede inspeccionar el tipo MIME, cambiar el contenido de la solicitud o almacenar en caché sus datos en el disco como lo desee. Esta idea viene por cortesía de Rob Napier:

http://robnapier.net/blog/offline-uiwebview-nsurlprotocol-588

Su código es ahora también en GitHub:

https://github.com/rnapier/RNCachingURLProtocol

+0

Gracias por publicar esos enlaces. Definitivamente es algo en lo que estoy interesado. – zekel

Cuestiones relacionadas