2011-09-02 3 views
0

검색해 보았지만 해결 방법을 찾지 못해서 누군가 도움을 줄 수 있기를 바랍니다.iPhone - 데이터 연결없이 UIWebView가 didFailLoadWithError를 호출하지 않습니다.

사용자가 단추를 누를 때 호출되는 UIWebView가 있습니다. 휴대 전화에 데이터 연결이 없을 때의 행동을 고려하지 않는 한 모든 것이 효과적입니다. 비행기 모드 또는 데이터 연결없이 전화로 처음 시간 동안의 UIWebView를 열려고 할 때

:

  • 있는 UIWebView가 시작

  • 로드 실패로드

UIWebView가 할당되고 처음으로로드되지 않으면 IBAction ([webView reload]를 호출하는)에 연결된 새로 고침 버튼을 누르면

이 발생합니다.210
  • 초기로드가 실패한 후 전화기에 데이터 연결이 있는지 여부에 관계없이 새로 고침 IBAction이 호출되지만 NSLog는 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입니다. 어떤 연결이 가능하지 않을 때 당신도 webView로드를 시작하지 않는 경우

NetworkStatus currentStatus = [[Reachability reachabilityForInternetConnection] 
           currentReachabilityStatus]; 

if(currentStatus == kReachableViaWWAN) // 3G 

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

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

것은, 당신은 아마 모두이 시나리오를 피할 수 있습니다.

이상한 동작에 대한 수정 : 새로 고침 방법에서 아직 아무 것도로드되지 않았는지 확인하고 그렇지 않은 경우 loadRequest:requestObj을 호출하십시오.예를 들어 :

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

    NSLog(@"RELOAD"); 
} 
+0

darvids0n, 처음에는 도달 가능성에 의존하는 것이 좋은 점은 혼자서하는 것이 아닙니다. 저는 수업을 알고 있었지만 쉽게 할 수 있는지보고 싶었습니다. 어쨌든, Reachability를 사용하는 것은 확실히 방법입니다. 왜냐하면 UIWebView가 우리가 생각하기에 좋지 않을 것이기 때문입니다. 많은 감사합니다! –

0
내가 같은 문제가 발생했다

:

  1. 가 비행기 모드 또는 데이터 연결없이 전화와 처음으로 내 UIWebView을 열고는, 다음과 같은 방법으로 불렸다 설정 :
    • -webView:shouldStartLoadWithRequest:navigationType:
    • -webViewDidStartLoad:
    • -webView:didFailLoadWithError
  2. 다음, 나는 그 말의, 새로 고침 버튼을 탭 나는 UIWebView-reload 방법은, 더 대리자 메서드가 호출되지 않았다,라고 그래서 심지어 타임 아웃 알림을 가져올 수 없습니다.

솔루션은 다음과 같습니다 부하 이전

  • 확인 네트워크 도달 상태 또는 @darvids0n의 훌륭한 조언을 요청, 많은 감사를 다시로드 (하지만 난 requestnil하지 알았을 때 다시로드 후 요청이 처음 실패했습니다).
  • loadRequest:을 사용하여 reload 대신 현재 URL을 다시로드하십시오.
  • 리로드 /로드 요청 후, 대리자 메서드가 호출되지 않은 경우 20 초와 같은 자체 타임 아웃 메커니즘을 구현합니다. 타임 아웃으로 가져 와서 요청 및 loadingHUD 애니메이션을 취소합니다.

일부 다른 유사한 문제 :

관련 문제