Obtenha o URL atual de UIWebView


110

Eu já tentei obter a URL atual da minha UIWebViewcom: webview.request.URL. Infelizmente, o NSURLestava vazio. Alguma coisa errada aqui? Estou trabalhando com o Xcode 3.2.2 beta 5.

O código acima deve ser executado no UIWebViewdelegado didStartLoad.


Faça esse código currentURL = currentWebView.request.URL.absoluteString; depois que sua visualização da web for carregada, use - (void) webViewDidFinishLoad: (UIWebView *) webView. Talvez isso ajude.
— Xcoder

OP, considerando que esta questão tem 78k visualizações, é uma bem referenciada. Você se importaria de atualizar a resposta aceita para a mais votada para evitar confusão futura? Obrigado!
— Albert Renshaw de

Respostas:


45

A versão de Matt é muito mais limpa. Eu recomendo a todos que usem esse em vez deste

Você pode tentar isto:

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

Obrigado. Meu código acima funciona ao executar em didFinishLoad .... Em algum lugar li que a versão js não funciona em todas as páginas. Mas eu tentarei.
— danielreiser

11
Matt, sua versão é muito mais limpa. Então, sim, eu recomendo a todos que usem esse em vez deste.
— Rengers

1
Só assim funciona, por exemplo em m.youtube.com. Todas as outras respostas retornam URLs errados.
— cprcrack

2
Na verdade, avalio "document.URL" e não "window.location" (que sempre estava em branco para mim). Isso é útil para ajustes internos ao URL da página em sites pesados ​​de JS que podem não usar carregamentos de página tradicionais.
— SmartyP de

1
Para as duas pessoas acima - Aubada Taljo e Taranfx - Rengers observou com bastante ousadia (literalmente, o texto está em negrito) e humildemente que as pessoas deveriam usar a versão de Matt com mais de 230 curtidas abaixo. Claramente, na hora de responder isso, funcionou e foi aceito e mais de 30 pessoas acharam que funcionava também. Isso agora tem 5,5 anos. Muito bom, Rengers. Obrigado por apontar as pessoas para a resposta de Matt abaixo.
— App Dev Guy

317

window.location via JS não funcionou de maneira confiável para mim, mas funcionou:

currentURL = currentWebView.request.URL.absoluteString;

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


9
Você obterá url incorreto se o seu site carregar alguns anúncios em outra solicitação. Variante mais clara escrita porMark Sands
— OdNairy

não funciona para resultados de pesquisa do google. Ao acessar os resultados de pesquisa do Google, ele está me mostrando o URL do Google, não o URL da página de resultados da pesquisa. Qualquer ajuda .........
— Nirav Gadhiya

@iOSDeveloper O Google provavelmente usa o estado de push "HTML5" para manipular o URL que não envolve a execução de outra solicitação (portanto, currentWebView.request não é atualizado).
— danw 01 de

3
Este método não parece funcionar se o site tiver feito um history.pushState
— andrrs

1
Em Swift 4: webView.request? .MainDocumentURL? .AbsoluteString
— DmitryKanunnikoff

55

aqui está o código que uso para obter o url sempre que você navegar para um link diferente no webview:

- (void)webViewDidFinishLoad:(UIWebView *)aWebView
{
  self.url = aWebView.request.mainDocumentURL;
}

quando tento fazer isso, o método nunca é chamado. Existe algo que eu poderia estar perdendo?
— Greg

1
@greg certifique-se de definir a si mesmo como o delegado do UIWebView
— bendytree

1
isso funcionou para mim enquanto webView.request.URL.absoluteStringvoltavanil
— bendytree

Obrigado, isso funcionou para mim também e é melhor do que currentWebView.request.URL.absoluteString;
— web hobbit

36

Eu também descobri que a resposta aprovada acima não era confiável. Mas com uma pequena modificação, parece funcionar sempre:

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

Observe a adição de ".href" ao Javascript, pois está oculto no final da linha de código.


2
Obrigado SarahR, seu método funciona mesmo se UIWebView carregou uma página apenas parcialmente.
— Dmitry Makarenko

18

Isso não está correto e retornará nulo:

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

No entanto, o código abaixo pode obter um URL, mas o url pode não ser o URL atual:

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

O correto é:

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

8
- (void)webViewDidFinishLoad:(UIWebView *)webView{
     NSURL *currentURL = [[webView request] URL];
     NSLog(@"%@",[currentURL description]);

}

4

Tentei isso para resultados de pesquisa do Google no iPhone:

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

Ambos retornam a mesma string!


3

aqui o código que eu uso:

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:[[[webView request] URL] absoluteString]]];

5
Você está criando um NSURL obtendo a string de um NSURL existente; você não poderia apenas copiar webView.request.URL?
— Pascal


2

Eu uso o shouldStartLoadWithRequestevento (UIWebViewDelegate) para capturar atualizações de URL. request.mainDocumentURL.absoluteStringobterá o URL da página principal da web (que normalmente é o que você deseja), enquanto request.URL.absoluteStringincluirá CSS e JavaScript inclui.


2

Isso sempre funciona. .

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

2

implementar o método delegado,

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

URL é exatamente o que você precisava.


1

IN Swift tente isso,

func webViewDidFinishLoad(webView: UIWebView){
    println(WebView.request?.mainDocumentURL)
}

1

Para obter o URL atual de WKWebView e UIWebview

Aqui está o código.

if (self.wkWebView) {
   NSString  *URL = self.wkWebView.title;
}else if(self.uiWebView) {
   NSString *URL = self.uiWebView.request.title;
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.