下面的代码让我有一个NSLog的TinyURL的链接重定向位置TinyURL的链接,当点击。 然而,如果删除了下面的代码段[[UIApplication sharedApplication] openURL:[request URL]];
,它会给我的NSLog,而不是TinyURL的链接到实际网站。 我怎样才能使它在那里,而共享应用代码,提出我可以在NSLog的实际网站的网址?
- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType {
NSLog(@"Redirect Location: %@",[request.URL absoluteString]);
[[UIApplication sharedApplication] openURL:[request URL]];
}
简短的回答:
使用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
网址,说, 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
是我定义的实际URL bit.ly
重定向URL,即连续两个重定向的最终目的地。 但是,如果你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
检索,我们就可以尽快收到了良好的反响取消连接(信心,我们已经知道哪个网站终于被重定向):
- (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请求,但。