【问题标题】:How to detect redirect in a UIWebView如何在 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/…
  • 抱歉,仍然可用。但问题是,在您的教程中,您在哪里检测到重定向?

标签: ios cocoa-touch url uiwebview


【解决方案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 属性效果要好得多,实际上可以让用户创建可用的历史记录。那是我的两分钱。

【讨论】:

    猜你喜欢
    • 2014-09-21
    • 1970-01-01
    • 1970-01-01
    • 2012-10-25
    • 2019-12-20
    • 1970-01-01
    • 1970-01-01
    • 2011-10-19
    • 1970-01-01
    相关资源
    最近更新 更多