2013-03-12 67 views
0

下面的代碼給我一個tinyurl鏈接上點擊一個tinyurl鏈接時的NSLog重定向位置。但是,如果我刪除了以下代碼[[UIApplication sharedApplication] openURL:[request URL]];,它會給我NSLog中的實際網站,而不是tinyurl鏈接。我怎樣才能讓它在我提供共享應用程序代碼的同時在NSLog中擁有實際的網站URL?xcode,nslog奇怪hitch

- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType { 
    NSLog(@"Redirect Location: %@",[request.URL absoluteString]); 
    [[UIApplication sharedApplication] openURL:[request URL]]; 
} 
+0

你是說如果你刪除這個方法的第二行,你會從第一行得到不同的結果?你能提供一些我們可以運行的代碼來證明這個問題嗎? – 2013-03-12 20:26:47

+0

是的,代碼應該張貼在上面。只需嘗試將網頁視圖鏈接到帶有網址的網站即可。 – 2013-03-12 20:31:00

+0

爲了測試這個,你必須創建一個帶有web視圖的整個應用程序。你必須對自己做一些測試 - 包括最小化代碼 - 試圖解決這個問題,所以分享結果。 – 2013-03-12 20:33:20

回答

1

簡短的回答:

使用UIWebViewDelegate方法shouldStartLoadWithRequest不搞清楚你會被重定向其網站(尤其是因爲,從你的代碼來看,你最終會打開它在一個偉大的機制一個外部應用程序,而不是你的UIWebView),因爲你在重定向發生之前得到了shouldStartLoadWithRequest。不過,您可以使用NSURLConnectionNSURLConnectionDataDelegate方法來確定您最終將被重定向到的位置。

龍答:

如果你看一下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一定要返回YESNO ...您的樣品不返回任何。)

正如你所看到的,因爲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請求。

+0

Ooo ...很好的答案,你救了我! +1 – TonyMkenu 2013-03-15 12:05:33