2011-09-02 50 views
0

我已經搜索,並沒有找到解決方案,所以希望有人可以幫助。iPhone - UIWebView不調用didFailLoadWithError沒有數據連接

我有一個用戶按下按鈕時調用的UIWebView。一切都很好,除非你在手機沒有數據連接的情況下解釋行爲。

當試圖打開的UIWebView爲第一時間與電話飛行模式或不帶數據連接:

  • UIWebView中開始加載
  • 加載失敗

一旦UIWebView被分配並且第一次加載失敗,點擊鏈接到IBAction(調用[webView reload])的刷新按鈕會導致:

  • 無論手機在初始加載失敗後是否有數據連接,都會調用刷新IBAction,但我的NSLogs告訴我既沒有調用webViewDidStartLoad,webViewDidFinishLoad也沒有調用webView ... didFailLoadWithError。

如果我離開應用程序運行和關閉數據連接的設備(例如關閉飛行模式,)然後回到我的應用程序並點擊刷新按鈕,[webView的重裝]被調用,但webViewDidStartLoad (並因此webViewDidFinishLoad)不被調用。

下面是相關代碼:

要打開web視圖:

-(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"); 
} 
+0

darvids0n,關於最初依靠可達性而不是獨自完成的好點。我知道這門課,但想知道是否可以輕鬆完成。無論哪種方式,使用可達性肯定是要走的路,如果僅僅因爲UIWebView不是我認爲我們很多人想要的那樣。非常感謝! –

0

我也遇到同樣的問題

  1. 打開我UIWebView首次使用飛行模式或者沒有數據連接的手機,下面的方法被稱爲在轉:
    • -webView:shouldStartLoadWithRequest:navigationType:
    • -webViewDidStartLoad:
    • -webView:didFailLoadWithError
  2. 然後,我拍了拍刷新按鈕,這是說,我叫UIWebView-reload方法,沒有委託方法被調用,所以我甚至無法得到超時通知。

解決方案是:加載之前或

  • 檢查網絡的可達性狀態重新加載請求,非常感謝@darvids0n的偉大的意見(不過我發現了requestnil當重裝後請求第一次失敗)。
  • 使用loadRequest:重新加載當前的URL而不是reload
  • 實現我自己的超時機制,比如重載/加載請求後20秒,如果沒有委託方法被調用,我把它作爲超時,並取消請求和加載HUD動畫。

其他一些類似問題