iPhone - UIWebView не вызывает didFailLoadWithError без подключения к данным - PullRequest
0 голосов
/ 02 сентября 2011

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

У меня есть UIWebView, который вызывается, когда пользователь нажимает кнопку.Все работает отлично, если только вы не учитываете поведение, когда телефон не подключен к данным.

При попытке открыть UIWebView на first время с телефоном в режиме полета или без данныхсоединение:

  • UIWebView начинает загружаться
  • Не загружается

Как только UIWebView выделен и не загружается в первый раз, происходит обновлениеКнопка, связанная с IBAction (которая вызывает [перезагрузка webView]), вызывает:

  • Независимо от того, имеет ли телефон соединение для передачи данных после неудачной начальной загрузки, вызывается обновление IBAction, но мои NSLogsскажите мне, что ни webViewDidStartLoad, ни webViewDidFinishLoad, ни webView… didFailLoadWithError не вызываются.

Если я оставляю приложение запущенным и включаю соединение для передачи данных с устройством (например, отключаю режим полета), затем возвращаюсь к моему приложению и нажимаю кнопку обновления, вызывается [перезагрузка webView], но webViewDidStartLoad (и, следовательно, webViewDidFinishLoad) не вызывается.

Вот соответствующий код:

Чтобы открыть веб-представление:

-(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 ]

2 голосов
/ 02 сентября 2011

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

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 голос
/ 27 мая 2017

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

  1. Откройте my UIWebView впервые с телефоном в режиме полета или без передачи данных, по очереди были вызваны следующие методы:
    • -webView:shouldStartLoadWithRequest:navigationType:
    • -webViewDidStartLoad:
    • -webView:didFailLoadWithError
  2. Затем я нажал кнопку обновления, то есть я вызвал метод UIWebView -reload, метод делегата не был вызван, поэтому я даже не смог получить уведомление о превышении времени ожидания.

My решение это:

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

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

...