如何在UIWebView中检测重定向

21

我在我的应用程序中使用UIWebView作为嵌入式浏览器,但问题是如何跟踪URL栏应该显示的网址。

在进行谷歌搜索时,结果页面通常会生成如下链接:

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栏显示的是上面谷歌链接中的长链接,而不是更新为维基百科的URL。


我在我的网站上有一个教程,向你展示如何实现这一点。请查看使用UIWebView构建Web浏览器(第三部分)。在教程的结尾处,有可供下载的源代码,你可以自由地在自己的项目中使用它。让我知道它是否符合你的需求。如果不是,也许我可以建议你如何修改它。 - idz
@drct 什么不再可用了吗?链接的教程和源代码(现在刚刚重新检查)还是可以使用的,而 -[NSURLRequest mainDocumentURL] 仍然可用(请参见 https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSURLRequest_Class/Reference/Reference.html#//apple_ref/doc/uid/20001695-BCIBDDEC)。 - idz
抱歉,仍然可用。但问题是,在您的教程中您在哪里检测重定向? - drct
请阅读标题为“保持地址栏同步”的部分。 - idz
@idz 你救了我的后半身。谢谢。 - Jezen Thomas
显示剩余2条评论
3个回答

19

你能做的最好的是观察webView:shouldStartLoadWithRequest:navigationType:委托方法。我认为重定向属于UIWebViewNavigationTypeOther


UIWebViewNavigationType 只表示用户发起请求的操作,它并不提供有关服务器正在执行什么操作的任何详细信息。 - user577537

7

虽然有点晚,但我会使用 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:提供的请求进行比较。 - user577537
是的,那也是个好主意,但我印象中webViewDidStartLoad中的request只是提供了输入请求。不过我已经测试过了,它确实可以工作,尽管在复杂情况下可能会出现问题。 - PowerAktar
我发现webViewDidStartLoad返回的NSMutableURLRequest是空的,因此不能用于太多事情。并没有做任何复杂的操作,只是使用loadRequest:加载网站,网站加载正常,否则webViewDidFinishLoad会正确返回请求。 - user577537

1
我正在处理同样的问题。最初我遵循这里的建议,使用maindocumenturl手动输入url到历史记录中以进行前进/后退导航。然而,无论您是从didstartload还是didfinishload获取url,这都不能提供非常准确的url。如果您想感受我的痛苦,请尝试通过Google搜索进行导航,您将看到我所说的,maindocumenturl在那种环境下完全没有用处。相比之下,与webviewdidfinishload一起使用的绝对url属性效果更好,并且实际上可以让用户创建可用的历史记录。这是我的两分钱。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接