如何在 UIWebView 中检测重定向
Posted
技术标签:
【中文标题】如何在 UIWebView 中检测重定向【英文标题】:How to detect redirect in a UIWebView 【发布时间】:2011-05-26 20:25:47 【问题描述】:我在我的应用程序中使用 UIWebView 作为嵌入式浏览器。我遇到的问题是跟踪应该在 URL 栏中显示的 URL。
在进行 Google 搜索时,结果页面通常会生成如下链接:
http://www.google.com/url?sa=t&source=web&cd=1&ved=0CC4QFjAA&url=http%3A%2F%2Fen.wikipedia.org%2Fwiki%2FDog&rct=j&q=dogs&ei=27XeTc6RFIWEvAO858DHBQ&usg=AFQjCNGkEDcWzea4pSlurHhcuQfqFcp_pw
当用户点击这个链接时,UIWebView先上报这个链接,然后shouldStartLoadWithRequest:navigationType:
中的重定向链接。
我怎么知道这是一个重定向,而不是为页面上的图像或其他元素加载的一些补充站点?就目前而言,我的 URL 栏在上面的示例中显示来自 Google 的长链接,而不是更新到 Wikipedia URL。
【问题讨论】:
我的网站上有一个教程,向您展示了如何做到这一点。查看Building a Web Browser with UIWebView (Part 3)。在本教程的最后,您可以在自己的项目中免费使用可下载的源代码。让我知道它是否符合您的要求。如果不是,也许我可以建议您如何修改它。 谢谢。我仍然无法明确检测到重定向,但我认为使用 [request mainDocumentURL] 可以满足我的需求。 不再提供 @drct 什么不再可用?链接的教程和源代码(现在刚刚重新检查)并且 -[NSURLRequest mainDocumentURL] 仍然可用(请参阅developer.apple.com/library/ios/documentation/Cocoa/Reference/…) 抱歉,仍然可用。但问题是,在您的教程中,您在哪里检测到重定向? 【参考方案1】:您真正能做的最好的事情就是观察webView:shouldStartLoadWithRequest:navigationType:
委托方法。我假设重定向属于UIWebViewNavigationTypeOther
。
【讨论】:
UIWebViewNavigationType
仅表示用户在发起请求时的操作,并没有提供有关服务器在做什么的任何详细信息。【参考方案2】:
现在有点晚了,但我会使用 webViewDidFinishLoad 和 webViewDidStartLoad 委托方法来检测重定向,如下所示:
- (void)webViewDidStartLoad:(UIWebView *)webView
myRequestedUrl= [webView.request mainDocumentURL];
NSLog(@"Requested url: %@", myRequestedUrl);
- (void)webViewDidFinishLoad:(UIWebView *)webView
myLoadedUrl = [webView.request mainDocumentURL];
NSLog(@"Loaded url: %@", myLoadedUrl);
//psudocode
if(myRequestedUrl is not the same as myLoadedUrl)
doSomething
【讨论】:
你试过了吗?我发现webViewDidStartLoad:
给出的webView
的request
属性不可靠。最好存储用于加载 UIWebView 的原始请求,并将其与webViewDidFinishLoad:
提供的请求进行比较。
是的,这也是一个好主意,但我的印象是 webViewDidStartLoad 中的 request 只是给出了输入请求。虽然我已经对其进行了测试,但它确实有效,但在复杂的情况下它可能会咳嗽。
我发现webViewDidStartLoad
返回一个空的NSMutableURLRequest
,因此不能使用太多。没有做任何明确复杂的事情,只是使用loadRequest:
加载网站,网站加载正常,webViewDidFinishLoad
否则正确返回请求。【参考方案3】:
我正在解决同样的问题。最初我遵循这里的建议并使用 maindocumenturl 手动将 url 输入到历史列表中以进行后退/前进导航。但是,无论您是从 didstartload 还是 didfinishload 获得的 url,这并没有给出非常准确的 url。如果您想感受我的痛苦,请尝试通过谷歌搜索导航,您会看到我在说什么,maindocumenturl 在那种环境中完全没用。相比之下,与 webviewdidfinishload 一起使用的绝对 url 属性效果要好得多,实际上可以让用户创建可用的历史记录。那是我的两分钱。
【讨论】:
以上是关于如何在 UIWebView 中检测重定向的主要内容,如果未能解决你的问题,请参考以下文章
iOS UIWebView 或 WKWebView URL 重定向