2010-05-12 47 views
7

Tengo una aplicación que usa WebKit WebView y me gustaría asignar las URL que se cargan en este WebView con un protocolo URL personalizado a una URL HTTP diferente. Por ejemplo, digamos que estoy cargando:Mapa Protocolo de URL personalizado a HTTP (¿usando NSURLProtocol?)

personalizado: // ruta/a/recurso

me gustaría internamente en realidad la carga:

http://something-else.com/path/to/resource

En otras palabras, el protocolo personalizado sirve casi como una taquigrafía. Sin embargo, no puedo usar -webView: resource: willSendRequest: redirectResponse: fromDataSource :, porque quiero que WebKit realmente crea que esta es la URL en cuestión, no simplemente para redireccionar de una a la otra.

Hasta ahora he intentado utilizar una subclase NSURLProtocol personalizada. Sin embargo, esto está resultando más complicado de lo que pensé en un principio porque, al menos a mi entender, tendré que hacer la carga real en el método startLoading de la subclase NSurLProtocol. Me gustaría una forma de entregar el trabajo al cargador de protocolo HTTP existente, pero no puedo encontrar una manera fácil de hacerlo.

¿Alguien tiene una recomendación para esto, o tal vez una forma alternativa de resolver este problema?

Gracias!

Respuesta

3

Uso el delegado de la política. Tiene algunas desventajas, pero es simple y suficiente para mis necesidades. Hago algo como esto:

- (void)webView:(WebView *)webView decidePolicyForNavigationAction:(NSDictionary *)actionInformation request:(NSURLRequest *)request frame:(WebFrame *)frame decisionListener:(id <WebPolicyDecisionListener>)listener; 

{ 
    if ([request.URL.scheme isEqualToString:@"custom"]) { 

     // do something interesting 
     // like force the webview to load another URL 

     [listener ignore]; 
     return; 
    } 

    [listener use]; 
} 

Para mi uso, también necesito detener la propagación de los eventos JS. Por lo tanto, normalmente coloco la URL en un controlador de eventos onclick que llama a window.event.stopPropagation(); después de establecer la ubicación.href.

No es muy elegante, pero es una forma muy flexible y muy simple de comunicar un evento JS al cacao.

+0

¿Tiene esto el efecto de hacer que la vista web piense que está en la URL del protocolo personalizado? Si solo cargara una nueva URL desde ese bloque if, creo que estaré en la misma posición que antes: creando de manera efectiva una redirección. Pero tal vez estoy malinterpretando la forma en que se supone que debo cargar una nueva URL desde allí. –

+0

"¿Tiene esto el efecto de hacer que la vista web piense que está en la URL del protocolo personalizado?" No, definitivamente no. Si su objetivo es establecer la href.location en una cosa y cargar otra, entonces esta solución no lo llevará allí. Lo siento. En este caso, cuando se detecta el esquema personalizado, incluso lo mata, por lo que el archivo location.href nunca cambia. "creando efectivamente una redirección" No es lo mismo que una redirección. En una redirección, la primera URL se carga, maneja, etc. Luego, se carga la siguiente URL. Usar el delegado de política y llamar [listener ignore] elimina por completo la primera carga de URL. – isaiah

0

se puede implementar el método WebResourceLoadDelegate:

- (NSURLRequest *)webView:(WebView *)sender resource:(id)identifier willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)redirectResponse fromDataSource:(WebDataSource *)dataSource 

Esto debería permitirle cambiar la petición de uno con la dirección URL HTTP.

Como alternativa, la implementación de una subclase NSURLProtocol no es muy difícil porque su protocolo puede abrir internamente otra NSURLConnection utilizando la URL HTTP correcta y asignar sus métodos de delegado al cliente del protocolo.

Cuestiones relacionadas