如何在 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】:

现在有点晚了,但我会使用 webViewDidFinishLoadwebViewDidStartLoad 委托方法来检测重定向,如下所示:

- (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: 给出的webViewrequest 属性不可靠。最好存储用于加载 UIWebView 的原始请求,并将其与webViewDidFinishLoad: 提供的请求进行比较。 是的,这也是一个好主意,但我的印象是 webViewDidStartLoad 中的 request 只是给出了输入请求。虽然我已经对其进行了测试,但它确实有效,但在复杂的情况下它可能会咳嗽。 我发现webViewDidStartLoad 返回一个空的NSMutableURLRequest,因此不能使用太多。没有做任何明确复杂的事情,只是使用loadRequest: 加载网站,网站加载正常,webViewDidFinishLoad 否则正确返回请求。【参考方案3】:

我正在解决同样的问题。最初我遵循这里的建议并使用 maindocumenturl 手动将 url 输入到历史列表中以进行后退/前进导航。但是,无论您是从 didstartload 还是 didfinishload 获得的 url,这并没有给出非常准确的 url。如果您想感受我的痛苦,请尝试通过谷歌搜索导航,您会看到我在说什么,maindocumenturl 在那种环境中完全没用。相比之下,与 webviewdidfinishload 一起使用的绝对 url 属性效果要好得多,实际上可以让用户创建可用的历史记录。那是我的两分钱。

【讨论】:

以上是关于如何在 UIWebView 中检测重定向的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django 视图中检测重定向

iOS UIWebView 或 WKWebView URL 重定向

如何在 Android Web 视图中检测重定向

使用 javascript 检测重定向 - 如何?

UIWebView 中的 Facebook 身份验证不会重定向回我网站上要求身份验证的原始页面

如何在 PHP 中检测、删除和重定向带有 # 的 URL?