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");
}
Я столкнулся с той же проблемой:
- Открой мой
UIWebView
впервые с телефоном в режиме полета или без передачи данных по очереди вызывались следующие методы:-webView:shouldStartLoadWithRequest:navigationType:
-webViewDidStartLoad:
-webView:didFailLoadWithError
- Затем я нажал кнопку обновления, то есть я позвонил
UIWebView
"s-reload
метод, метод делегата не был вызван, поэтому я даже не смог получить уведомление о превышении времени ожидания.
Мое решение:
- Проверяйте состояние доступности сети перед запросами на загрузку или перезагрузку, большое спасибо замечательному совету @darvids0n (Но я узнал, что
request
не являетсяnil
при перезагрузке после запроса не удалось в первый раз). - использование
loadRequest:
перезагрузить текущий URL вместоreload
, - Реализовать мой собственный механизм тайм-аута, такой как 20 секунд после запроса перезагрузки / загрузки, если методы делегата не были вызваны, я принимаю его как тайм-аут и отменяю запросы и загружая анимацию HUD.
Некоторые другие подобные проблемы: