Obtener la URL actual de UIWebView

110

Ya he intentado conseguir la URL actual de mi UIWebViewcon: webview.request.URL. Desafortunadamente, el NSURLestaba vacío. ¿Algo anda mal aquí? Estoy trabajando con Xcode 3.2.2 beta 5.

El código anterior debe ejecutarse en el UIWebViewdelegado didStartLoad.

danielreiser
fuente
Haga ese código currentURL = currentWebView.request.URL.absoluteString; después de que se cargue la vista web, utilice - (void) webViewDidFinishLoad: (UIWebView *) webView. Quizás esto pueda ayudar.
Xcoder
OP, considerando que esta pregunta tiene 78k vistas, es una bastante bien referenciada. ¿Le importaría actualizar la respuesta aceptada a la más votada para evitar confusiones futuras? ¡Gracias!
Albert Renshaw

Respuestas:

45

La versión de Matt es mucho más limpia. Recomiendo a todos que usen ese en lugar de este

Puedes probar esto:

NSString *currentURL = [webView stringByEvaluatingJavaScriptFromString:@"window.location"];
Rengers
fuente
Gracias. Mi código anterior funciona cuando se ejecuta en didFinishLoad .... En algún lugar he leído que la versión js no funciona en todas las páginas. Pero lo intentaré.
danielreiser
11
Matt su versión es mucho más limpia. Así que sí, recomiendo a todos que usen ese en lugar de este.
Rengers
1
Esta es la única forma en que funciona, por ejemplo, en m.youtube.com. Todas las demás respuestas devuelven URL incorrectas.
cprcrack
2
De hecho, evalúo "document.URL" y no "window.location" (que siempre estaba en blanco para mí). Esto es útil para los ajustes internos de la URL de la página en sitios pesados ​​de JS que pueden no usar cargas de página tradicionales.
SmartyP
1
Para las dos personas anteriores, Aubada Taljo y Taranfx, Rengers ha señalado con bastante audacia (literalmente, el texto es en negrita) y con humildad que la gente debería usar la versión de Matt con más de 230 me gusta a continuación. Claramente, al momento de responder esto, funcionó y fue aceptado y más de 30 personas sintieron que también funcionó. Esto ahora tiene 5.5 años. Buen material, Rengers. Gracias por indicarle a la gente la respuesta de Matt a continuación.
App Dev Guy
317

window.location a través de JS no funcionó de manera confiable para mí, pero esto sí:

currentURL = currentWebView.request.URL.absoluteString;

Crédito: http://mohrt.blogspot.com/2008/10/getting-url-from-uiwebview.html

Matt Andersen
fuente
9
Obtendrá una URL incorrecta si su sitio carga algunos anuncios en otra solicitud. Variante más clara escrita porMark Sands
OdNairy
no funciona para los resultados de búsqueda de Google. Al acceder a los resultados de búsqueda de Google, me muestra la URL de Google, no la URL de la página de resultados de búsqueda. Cualquier ayuda .........
Nirav Gadhiya
@iOSDeveloper Google probablemente usa el estado push "HTML5" para manipular la URL, lo que no implica ejecutar otra solicitud (por lo que currentWebView.request no se actualiza).
danw
3
Este método no parece funcionar si el sitio web ha realizado un history.pushState
andrrs
1
En Swift 4: webView.request? .MainDocumentURL? .AbsoluteString
DmitryKanunnikoff
55

aquí está el código que utilizo para tomar la URL cada vez que navega a un enlace diferente dentro de la vista web:

- (void)webViewDidFinishLoad:(UIWebView *)aWebView
{
  self.url = aWebView.request.mainDocumentURL;
}
Mark Sands
fuente
cuando intento esto, nunca se llama al método. ¿Hay algo que me pueda perder?
Greg
1
@greg asegúrese de establecerse como delegado de
UIWebView
1
esto funcionó para mí mientras webView.request.URL.absoluteStringregresabanil
bendytree
Gracias, esto funcionó para mí también y es mejor que currentWebView.request.URL.absoluteString;
web hobbit
36

Yo también descubrí que la respuesta aprobada anterior no era confiable. Pero con una ligera modificación, parece funcionar siempre:

NSString *currentURL = [webView stringByEvaluatingJavaScriptFromString:@"window.location.href"];

Tenga en cuenta la adición de ".href" al Javascript ya que está oculto al final de la línea de código.

SarahR
fuente
2
Gracias SarahR, su método funciona incluso si UIWebView cargó una página solo en parte.
Dmitry Makarenko
18

Esto no es correcto y devolverá un cero:

NSString *currentURL = [webView stringByEvaluatingJavaScriptFromString:@"window.location"];

Sin embargo, el código siguiente puede obtener una URL, pero es posible que la URL no sea la URL actual:

NSString *url = _webView.request.URL.absoluteString;

El correcto es:

NSString *currentURL = [_webView stringByEvaluatingJavaScriptFromString:@"window.location.href"];
DD
fuente
8
- (void)webViewDidFinishLoad:(UIWebView *)webView{
     NSURL *currentURL = [[webView request] URL];
     NSLog(@"%@",[currentURL description]);

}
sivasankar
fuente
4

Intenté esto para los resultados de búsqueda de Google en iPhone:

 NSString* currentURL = webView.request.URL.absoluteString;
 NSString* mainDocumentURL = webView.request.mainDocumentURL.absoluteString;

¡Ambos devuelven la misma cadena!

Alex Stone
fuente
3

aquí el código que uso:

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:[[[webView request] URL] absoluteString]]];
Bobj-C
fuente
5
Está creando una NSURL obteniendo la cadena de una NSURL existente; ¿No podrías simplemente copiar webView.request.URL?
Pascal
3

Como UIWebView está obsoleto, para WKWebview obtener la URL actual es muy simple.

webView.url
Kris Roofe
fuente
2

Utilizo el shouldStartLoadWithRequestevento (UIWebViewDelegate) para detectar actualizaciones de URL. request.mainDocumentURL.absoluteStringobtendrá la URL de la página web principal (que normalmente es lo que desea), mientras request.URL.absoluteStringque incluirá CSS y JavaScript.

Tom Söderlund
fuente
2

Esto siempre funciona. .

NSString* url= [webView stringByEvaluatingJavaScriptFromString:@"window.location.href"];
Shaik Riyaz
fuente
2

implementar el método delegado,

- (BOOL)webView:(UIWebView *)webview shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    NSString  *URL = request.URL.absoluteString;    NSLog(@"%@",URL);
}

URL es exactamente lo que necesitabas.

Gobi M
fuente
1

EN Swift prueba esto,

func webViewDidFinishLoad(webView: UIWebView){
    println(WebView.request?.mainDocumentURL)
}
Mohammad Zaid Pathan
fuente
1

Para obtener la URL actual de WKWebView y UIWebview

Aquí está el código.

if (self.wkWebView) {
   NSString  *URL = self.wkWebView.title;
}else if(self.uiWebView) {
   NSString *URL = self.uiWebView.request.title;
}
Stalin Pusparaj
fuente