iPhone - UIWebView не вызывает didFailLoadWithError без подключения к данным

Я искал и не нашел решения этой проблемы, поэтому, надеюсь, кто-то может помочь.

У меня есть 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");
}

Мысли?


person Community    schedule 02.09.2011    source источник


Ответы (2)


Хороший способ проверить, стоит ли вообще пытаться загружать веб-страницу, — использовать Доступность.

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");
}
person Community    schedule 02.09.2011
comment
darvids0n, хорошо, что изначально я полагался на Reachability, а не делал это самостоятельно. Я знал о классе, но хотел посмотреть, можно ли это легко сделать самостоятельно. В любом случае, использование Reachability — это, безусловно, правильный путь, хотя бы потому, что UIWebView — это не то, что, я думаю, многие из нас хотели бы видеть. Большое спасибо! - person ; 02.09.2011

Я столкнулся с той же проблемой:

  1. Open my UIWebView for the first time with the phone on airplane mode or without a data connection, the following methods were called in turn:
    • -webView:shouldStartLoadWithRequest:navigationType:
    • -webViewDidStartLoad:
    • -webView:didFailLoadWithError
  2. Затем я нажал кнопку обновления, то есть я вызвал метод -reload UIWebView, метод делегата не был вызван, поэтому я даже не мог получить уведомление об истечении времени ожидания.

Мое решение таково:

  • Проверяйте состояние доступности сети перед запросами на загрузку или перезагрузку, большое спасибо за отличный совет @darvids0n (но я узнал request не nil при перезагрузке после первой неудачной попытки запроса).
  • Используйте loadRequest: для перезагрузки текущего URL вместо reload.
  • Реализовать свой собственный механизм тайм-аута, например, через 20 секунд после запроса на перезагрузку/загрузку, если методы делегата не вызывались, я воспринимаю это как тайм-аут и отменяю запросы и загружаю анимацию HUD.

Некоторые другие похожие проблемы:

person ShannonChenCHN    schedule 27.05.2017