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

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

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

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

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

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

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

Если я оставляю приложение работающим и включаю подключение для передачи данных к устройству (например, отключаю режим полета), затем возвращаюсь к моему приложению и нажимаю кнопку обновления, вызывается [webView reload], но 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 ответа

Решение

Хороший способ проверить, стоит ли вам пытаться загрузить веб-страницу, - это 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. Открой мой UIWebView впервые с телефоном в режиме полета или без передачи данных по очереди вызывались следующие методы:
    • -webView:shouldStartLoadWithRequest:navigationType:
    • -webViewDidStartLoad:
    • -webView:didFailLoadWithError
  2. Затем я нажал кнопку обновления, то есть я позвонил UIWebView "s -reload метод, метод делегата не был вызван, поэтому я даже не смог получить уведомление о превышении времени ожидания.

Мое решение:

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

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

Другие вопросы по тегам