简短的回答:
使用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