2011-05-26 113 views
20

我在我的應用程序中使用UIWebView作爲嵌入式瀏覽器。我遇到的問題是跟蹤應該顯示在URL欄中的URL。如何檢測UIWebView中的重定向

在做一個谷歌搜索,結果頁面往往產生鏈接這樣的:

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

當用戶點擊該鏈接時,UIWebView的第一次報告此鏈接,然後在shouldStartLoadWithRequest:navigationType:重定向的鏈接。

我怎麼能告訴這是一個重定向,而不是爲頁面上的圖像或其他元素加載一些補充站點?在上面的例子中,我的URL欄顯示了Google的長鏈接,而不是更新到Wikipedia URL。

+0

我在我的網站上有一個教程,告訴你如何做到這一點。查看[使用UIWebView構建Web瀏覽器(第3部分)](http://iosdeveloperzone.com/2011/05/22/tutorial-building-a-web-browser-with-uiwebview-part-3/)。在教程結尾處有可下載的源代碼,您可以在自己的項目中自由使用。讓我知道它是否做到了你想要的。如果沒有,我可以建議你如何修改它。 – idz 2011-05-26 21:46:53

+0

謝謝你。我仍然無法確定檢測到重定向,但使用[請求mainDocumentURL]我認爲會給我我需要的東西。 – zorro2b 2011-06-01 09:42:36

+0

@idz你救了我的背影。謝謝。 – 2013-03-19 14:06:57

回答

18

您真正能做的最好的事情是觀察webView:shouldStartLoadWithRequest:navigationType:委託方法。我認爲重定向屬於UIWebViewNavigationTypeOther

+0

UIWebViewNavigationType只指示用戶在發起請求時的操作,它沒有提供關於服務器正在做什麼的任何細節。 – 2012-04-25 10:22:26

5

晚了一點,但現在我會用webViewDidFinishLoadwebViewDidStartLoad委託方法來檢測重定向如下:

- (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

你有試過嗎?我發現'webViewDidStartLoad:'給出的'webView'的request屬性是不可靠的。最好存儲用於加載UIWebView的原始請求,並將其與'webViewDidFinishLoad:'提供的請求進行比較。 – 2012-04-26 15:33:41

+0

是的,這也是一個不錯的主意,但我在** webViewDidStartLoad **中只是給出了輸入請求。 我已經測試過它,但確實有效,雖然在複雜的情況下可能會咳嗽。 – PowerAktar 2012-04-26 20:07:24

+0

我發現'webViewDidStartLoad'返回一個空的'NSMutableURLRequest',因此不能使用太多。沒有做任何明顯複雜的事情,只需使用'loadRequest:'加載網站,網站就會正常加載,否則'webViewDidFinishLoad'會正確返回請求。 – 2012-04-27 08:51:59

1

我通過這個同樣的問題的工作。最初我遵循這裏的建議,並使用maindocumenturl手動輸入網址到後退/前進導航的歷史列表中。然而,這並沒有給出非常準確的url,無論你是否從didstartload或didfinishload獲得了url。如果你想感受我的痛苦,試着瀏覽谷歌搜索,你會看到我在說什麼,maindocumenturl在那個環境中是完全沒用的。相比之下,webviewdidfinishload使用的絕對url屬性效果更好,實際上可以讓用戶創建可用的歷史記錄。這是我的兩分錢。