2011-05-26 14 views
20

Estoy usando un UIWebView como un navegador integrado dentro de mi aplicación. El problema que tengo es el seguimiento de la URL que debe mostrarse en la barra de URL.Cómo detectar la redirección en un UIWebView

Al hacer una búsqueda en Google, la página de resultados a menudo genera enlaces de la siguiente manera:

http://www.google.com/url?sa=t&source=web&cd=1&ved=0CC4QFjAA&url=http%3A%2F%2Fen.wikipedia.org%2Fwiki%2FDog&rct=j&q=dogs&ei=27XeTc6RFIWEvAO858DHBQ&usg=AFQjCNGkEDcWzea4pSlurHhcuQfqFcp_pw

Cuando el usuario hace clic en este enlace, los primeros informes UIWebView este enlace y luego en el enlace redireccionado en shouldStartLoadWithRequest:navigationType:.

¿Cómo puedo saber que esto es una redirección en lugar de cargar un sitio suplementario para imágenes u otros elementos en la página? Tal como está, mi barra de URL muestra el enlace largo de Google en el ejemplo anterior en lugar de actualizar a la URL de Wikipedia.

+0

Tengo un tutorial en mi sitio web que le muestra cómo hacerlo. Consulte [Creación de un navegador web con UIWebView (Parte 3)] (http://iosdeveloperzone.com/2011/05/22/tutorial-building-a-web-browser-with-uiwebview-part-3/). Al final del tutorial hay un código fuente descargable que puede usar libremente en su propio proyecto. Avísame si hace lo que quieres. Si no, tal vez te sugiera cómo puedes modificarlo. – idz

+0

Gracias por eso. Todavía no puedo detectar definitivamente una redirección, pero usando [request mainDocumentURL] creo que me dará lo que necesito. – zorro2b

+0

@idz Has guardado mi trasero. Gracias. –

Respuesta

18

Lo mejor que puedes hacer realmente es observar el método delegado webView:shouldStartLoadWithRequest:navigationType:. Supongo que los redireccionamientos están bajo UIWebViewNavigationTypeOther.

+0

'UIWebViewNavigationType' solo indica la acción del usuario al iniciar la solicitud, no proporciona ningún detalle sobre lo que está haciendo el servidor. –

5

Un poco tarde ahora, pero me gustaría utilizar el webViewDidFinishLoad y la webViewDidStartLoad métodos de delegado para detectar redirecciones de la siguiente manera:

- (void)webViewDidStartLoad:(UIWebView *)webView{ 

    myRequestedUrl= [webView.request mainDocumentURL]; 
    NSLog(@"Requested url: %@", myRequestedUrl);  
} 

- (void)webViewDidFinishLoad:(UIWebView *)webView{ 

    myLoadedUrl = [webView.request mainDocumentURL]; 
    NSLog(@"Loaded url: %@", myLoadedUrl); 

    //psudocode 
    if(myRequestedUrl is not the same as myLoadedUrl){ 
     doSomething 
    } 
} 
+0

¿Has probado esto? He encontrado que la propiedad 'request' de' webView' dada por 'webViewDidStartLoad:' no es confiable. Lo mejor es almacenar la solicitud original utilizada para cargar UIWebView y compararla con la solicitud proporcionada por 'webViewDidFinishLoad:'. –

+0

Sí, eso también es una buena idea, pero estaba bajo la impresión de ** solicitud ** en ** webViewDidStartLoad ** simplemente da la solicitud de entrada. Sin embargo, lo he probado y funciona, aunque tal vez en situaciones complejas podría fallar. – PowerAktar

+0

He encontrado que 'webViewDidStartLoad' devuelve una' NSMutableURLRequest' que está vacía y, por lo tanto, no se puede usar por mucho. No hacer nada explícitamente complejo, simplemente cargar sitios web usando 'loadRequest:', el sitio carga bien y 'webViewDidFinishLoad' devuelve la solicitud correctamente de lo contrario. –

1

estoy trabajando a través de esta misma edición. Originalmente seguí los consejos aquí y usé maindocumenturl para ingresar urls manualmente en una lista de historial para navegación hacia atrás/adelante. Sin embargo, esto no proporcionó direcciones URL muy precisas, ya sea que obtuviera o no la URL de didstartload o didfinishload. Si quieres sentir mi dolor, intenta navegar a través de una búsqueda en Google y verás de lo que estoy hablando, maindocumenturl es completamente inútil en ese entorno. Por el contrario, la propiedad url absoluta utilizada con webviewdidfinishload funciona mucho mejor, y en realidad le permite al usuario crear un historial utilizable. Esos son mis dos centavos.

Cuestiones relacionadas