簡短的回答:
使用UIWebViewDelegate
方法shouldStartLoadWithRequest
不搞清楚你會被重定向其網站(尤其是因爲,從你的代碼來看,你最終會打開它在一個偉大的機制一個外部應用程序,而不是你的UIWebView
),因爲你在重定向發生之前得到了shouldStartLoadWithRequest
。不過,您可以使用NSURLConnection
和NSURLConnectionDataDelegate
方法來確定您最終將被重定向到的位置。
龍答:
如果你看一下shouldStartLoadWithRequest
,如果返回YES
,你讓UIWebView
跟蹤重定向請求。考慮以下shouldStartLoadWithRequest
:
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
NSLog(@"%@", request.URL);
return YES;
}
如果您使用此與隨機bit.ly
URL,比如,http://nyti.ms/Yi6EAk
,你會看到以下日誌:
2013-03-12 21:23:31.418 webtest[6959:c07] http://nyti.ms/Yi6EAk
2013-03-12 21:23:31.511 webtest[6959:c07] http://bit.ly/Yi6EAk?cc=0d7134b272b1004cb954d0400076e9fa
2013-03-12 21:23:31.560 webtest[6959:c07] http://www.nytimes.com/2013/03/13/us/politics/ryans-plan-aims-to-balance-budget-in-10-years.html?hp&_r=0
那對shouldStartLoadWithRequest
第三個電話是實際我爲其定義了bit.ly
重定向網址的網址,即兩個連續重定向的最終目的地。但是,如果您的shouldStartLoadWithRequest
返回NO
,那麼您永遠不會知道它最終會被重定向到哪個網站。 (順便說一句,你shouldStartLoadWithRequest
一定要返回YES
或NO
...您的樣品不返回任何。)
正如你所看到的,因爲shouldStartLoadWithRequest
發生重定向有機會發生之前,你」我會看到每一個重定向發生。根據結果網站的作用,隨着頁面檢索額外內容,您可能會看到隨後的shouldStartLoadWithRequest
調用。這使得這是一個尷尬的機制,以找出你最終重定向到哪個網站。
如果您確實需要將您重定向到的網站,您可能需要使用NSURLConnection
。雖然這通常用於從服務器實際檢索數據,但它也可以用於捕獲重定向(但不會受到UIWebViewDelegate
方法shouldStartLoadWithRequest
問題的困擾,在這種方法中,很難區分真正的重定向和隨機附加內容,該頁面可以隨後請求)。
所以考慮以下幾點:
self.url = [NSURL URLWithString:@"http://nyti.ms/Yi6EAk"];
NSURLRequest *request = [NSURLRequest requestWithURL:self.url];
[NSURLConnection connectionWithRequest:request delegate:self];
然後,您可以實現connection:willSendRequest:redirectResponse:
,一個NSURLConnectionDataDelegate
方法,將跟蹤不同的重定向:
- (NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)response
{
self.url = request.URL;
return request;
}
清楚,因爲你使用NSURLConnection
追蹤重定向,但我們並不在意responseData
我們通常使用NSURLConnection
進行檢索,只要您收到良好回覆,我們就可以取消連接(放心NT,我們已經知道哪個網站終於被重定向到):
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
[connection cancel];
NSLog(@"Ok, we now know that the resulting URL is %@", self.url);
}
你可能會,順便說一下,也想捕獲連接錯誤,例如:
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
NSLog(@"Ok, we failed trying to retrieve data from %@", self.url);
}
最後,值得指出這種技術,使得HTTP請求與NSURLConnection
並讓它遵循整個系列重定向,是一個相當低效的過程,所以你必須決定它是否值得。但是,這是找出您的HTTP重定向將引導您的方式之一。
最後一個警告,它捕獲傳統的重定向,但如果頁面正在做任何客戶端JavaScript重定向,我不認爲這種技術會起作用。但它適用於絕大多數重定向的HTTP請求。
你是說如果你刪除這個方法的第二行,你會從第一行得到不同的結果?你能提供一些我們可以運行的代碼來證明這個問題嗎? – 2013-03-12 20:26:47
是的,代碼應該張貼在上面。只需嘗試將網頁視圖鏈接到帶有網址的網站即可。 – 2013-03-12 20:31:00
爲了測試這個,你必須創建一個帶有web視圖的整個應用程序。你必須對自己做一些測試 - 包括最小化代碼 - 試圖解決這個問題,所以分享結果。 – 2013-03-12 20:33:20