Pobierz aktualny adres URL UIWebView


110

Próbowałem już coraz aktualny adres URL mojej UIWebViewz: webview.request.URL. Niestety NSURLbył pusty. Coś tu nie tak? Pracuję z Xcode 3.2.2 beta 5.

Powyższy kod powinien zostać wykonany w UIWebViewdelegacie didStartLoad.


Zrób ten kod currentURL = currentWebView.request.URL.absoluteString; po załadowaniu widoku sieci Web, więc użyj - (void) webViewDidFinishLoad: (UIWebView *) webView. Może to pomoże.
Xcoder

OP, biorąc pod uwagę, że to pytanie ma 78 tys. Wyświetleń, jest całkiem dobrze przywoływane. Czy mógłbyś zaktualizować zaakceptowaną odpowiedź na zdecydowanie bardziej pozytywną, aby zapobiec przyszłym nieporozumieniom? Dzięki!
Albert Renshaw,

Odpowiedzi:


45

Wersja Matt jest znacznie czystszy. Zalecam wszystkim używanie tego zamiast tego

Możesz spróbować tego:

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

Dzięki. Mój kod powyżej działa podczas wykonywania w didFinishLoad .... Gdzieś przeczytałem, że wersja js nie działa na każdej stronie. Ale spróbuję.
danielreiser

11
Matt jego wersja jest znacznie czystsza. Więc tak, polecam wszystkim używanie tego zamiast tego.
Rengers

1
Tylko w ten sposób działa na przykład na m.youtube.com. Wszystkie inne odpowiedzi zwracają nieprawidłowe adresy URL.
cprcrack

2
W rzeczywistości oceniam „document.URL”, a nie „window.location” (które zawsze było puste). Jest to przydatne do wewnętrznych dostosowań adresu URL strony w witrynach z dużą ilością kodu JS, które mogą nie używać tradycyjnego ładowania stron.
SmartyP,

1
Dwie osoby powyżej - Aubada Taljo i Taranfx - Rengers zauważyli dość odważnie (dosłownie tekst jest pogrubiony) i pokornie, że ludzie powinni używać wersji Matta z ponad 230 polubieniami poniżej. Najwyraźniej w chwili udzielenia odpowiedzi zadziałało i zostało zaakceptowane, a ponad 30 osób uznało, że też działa. To ma teraz 5,5 roku. Dobra rzecz, Rengers. Dzięki za wskazanie ludziom odpowiedzi Matta poniżej.
App Dev Guy

317

window.location przez JS nie działało dla mnie niezawodnie, ale to:

currentURL = currentWebView.request.URL.absoluteString;

Źródło: http://mohrt.blogspot.com/2008/10/getting-url-from-uiwebview.html


9
Otrzymasz niepoprawny adres URL, jeśli witryna wczyta niektóre reklamy w innym żądaniu. Bardziej przejrzysty wariant napisany przezMark Sands
OdNairy

nie działa dla wyników wyszukiwania google. Podczas uzyskiwania dostępu do wyników wyszukiwania z google pokazuje mi adres URL google, a nie adres strony wyników wyszukiwania. Jakakolwiek pomoc .........
Nirav Gadhiya,

@iOSDeveloper Google prawdopodobnie używa stanu push „HTML5” do manipulowania adresem URL, który nie obejmuje wykonywania innego żądania (więc currentWebView.request nie jest aktualizowany).
danw

3
Ta metoda wydaje się nie działać, jeśli witryna zrobiła historię.pushState
andrrs

1
W Swift 4: webView.request? .MainDocumentURL? .AbsoluteString
DmitryKanunnikoff

55

oto kod, którego używam do pobierania adresu URL za każdym razem, gdy przechodzisz do innego linku w widoku internetowym:

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

kiedy próbuję tego, metoda nigdy nie jest wywoływana. Czy jest coś, czego mógłbym przegapić?
Greg,

1
@greg upewnij się, że ustawiłeś się jako delegat UIWebView
bendytree

1
to działało dla mnie po webView.request.URL.absoluteStringpowrocienil
bendytree

Dzięki, to też zadziałało i jest lepsze niż currentWebView.request.URL.absoluteString;
web hobbit

36

Ja również stwierdziłem, że zatwierdzona powyżej odpowiedź nie była wiarygodna. Ale z niewielką modyfikacją wydaje się działać za każdym razem:

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

Zwróć uwagę na dodanie „.href” do skryptu JavaScript, ponieważ jest on ukryty na końcu wiersza kodu.


2
Dzięki SarahR, twoja metoda działa nawet wtedy, gdy UIWebView załadował stronę tylko częściowo.
Dmitry Makarenko

18

To nie jest poprawne i zwróci zero:

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

Jednak poniższy kod może uzyskać adres URL, ale URL może nie być aktualnym adresem URL:

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

Prawidłowy to:

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

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

}

4

Próbowałem tego dla wyników wyszukiwania Google na iPhonie:

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

Obie zwracają ten sam ciąg!


3

tutaj kod, którego używam:

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

5
Tworzysz identyfikator NSURL, pobierając ciąg z istniejącego adresu NSURL; nie mógłbyś po prostu skopiować webView.request.URL?
Pascal,


2

Używam shouldStartLoadWithRequestzdarzenia (UIWebViewDelegate) do przechwytywania aktualizacji adresów URL. request.mainDocumentURL.absoluteStringdostaniesz adres URL głównej strony internetowej (który zwykle jest tym, czego chcesz), a jednocześnie request.URL.absoluteStringzawiera CSS i JavaScript.


2

To zawsze działa. .

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

2

wdrożyć metodę delegata,

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

URL to dokładnie to, czego potrzebujesz.



1

Aby uzyskać aktualny adres URL WKWebView i UIWebview

Oto kod.

if (self.wkWebView) {
   NSString  *URL = self.wkWebView.title;
}else if(self.uiWebView) {
   NSString *URL = self.uiWebView.request.title;
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.