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.