2013-03-12 56 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