iPhone - UIWebView没有数据连接就没有调用didFailLoadWithError

时间:2011-09-02 02:34:41

标签: iphone webview reload didfailwitherror

我已经搜索过并且没有找到解决方案,所以希望有人可以提供帮助。

我有一个用户按下按钮时调用的UIWebView。一切都很好,除非你考虑手机没有数据连接时的行为。

尝试在手机处于飞行模式或没有数据连接时第一次时打开UIWebView:

  • UIWebView开始加载
  • 无法加载

一旦分配了UIWebView并且第一次无法加载,点击链接到IBAction(调用[webView reload])的刷新按钮会导致:

  • 无论手机在初始加载失败后是否有数据连接,都会调用刷新IBAction,但我的NSLogs告诉我既不调用webViewDidStartLoad,也不调用webViewDidFinishLoad,也不调用webView ... didFailLoadWithError。

如果我让应用程序继续运行并打开与设备的数据连接(例如关闭飞行模式),然后返回我的应用程序并点击刷新按钮,调用[webView reload],但是webViewDidStartLoad(以及webViewDidFinishLoad)未被调用。

以下是相关代码:

调出webView:

-(IBAction)loadWebView {

    webView = [[UIWebView alloc] init];
    webView.scalesPageToFit = YES;
    [webView setDelegate:self];

    NSString *urlAddress = @"http://google.com";
    NSURL *url = [NSURL URLWithString:urlAddress];
    NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];

    [webView loadRequest:requestObj];

}

重新加载:

  -(IBAction)reloadWebView{
    [webView reload];
    NSLog(@"RELOAD");
}

webViewDidStart,DidFinish,didFailLoadWithError:

 - (void)webViewDidStartLoad:(UIWebView *)webView
{  
    NSLog(@"START LOAD");   
}

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
     NSLog(@"FINISH LOAD");    
}

- (void)webView:(UIWebView *) webView didFailLoadWithError:(NSError *)error 
{ 
       NSLog(@"DID FAIL");
}

思想?

2 个答案:

答案 0 :(得分:2)

检查您是否应该尝试加载网页的好方法是使用Reachability

NetworkStatus currentStatus = [[Reachability reachabilityForInternetConnection] 
                               currentReachabilityStatus];

if(currentStatus == kReachableViaWWAN) // 3G

else if(currentStatus == kReachableViaWifi) // ...wifi

else if(currentStatus == kNotReachable) // no connection currently possible

如果在没有连接的情况下甚至没有启动webView加载,您可以完全避免这种情况。

修复奇怪的行为:在刷新方法中尝试检查它是否已加载任何内容,如果没有,则在那里调用loadRequest:requestObj。例如:

- (IBAction)reloadWebView {
    if(webView.request != nil)
        [webView reload];
    else {
        // reconstruct requestObj here, or use a class member
        [webView loadRequest:requestObj];
    }

    NSLog(@"RELOAD");
}

答案 1 :(得分:1)

我确实遇到了相同的问题

  1. 首次使用飞机模式的手机或没有数据连接打开我的UIWebView,依次调用以下方法:
    • -webView:shouldStartLoadWithRequest:navigationType:
    • -webViewDidStartLoad:
    • -webView:didFailLoadWithError
  2. 然后,我点击了刷新按钮,也就是说,我调用UIWebView的{​​{1}}方法,没有调用委托方法,所以我甚至无法获得超时通知。
  3. 我的解决方案是:

    • 在加载或重新加载请求之前检查网络可访问性状态,非常感谢@darvids0n的好建议(但是在请求失败后重新加载时我发现-reload不是request第一次)。
    • 使用nil重新加载当前网址而不是loadRequest:
    • 实现我自己的超时机制,例如,重载/加载请求后20秒,如果没有调用委托方法,我将其视为超时,取消请求和loadingHUD动画。

    其他一些类似问题