UIWebView獲取404、504等錯誤碼

問題描述

在使用webview時,會存在這么一個問題:
????如果訪問服務(wù)器返回異常,比如404、504這樣的錯誤,需要在native端展示特定的圖片和文案(404、504醬紫的錯誤碼有些不美觀)。那么,問題就來了,怎樣才能知道webview的訪問出錯了,是什么錯???

問題分析

從webview發(fā)起請求之后,能夠查看webview加載狀態(tài)的就是它的代理了,所以就從各個代理方法著手分析。

    // webview被指示加載內(nèi)容時調(diào)用,返回YES才會進行加載
    - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
    // webview已經(jīng)開始加載一個請求后調(diào)用
    - (void)webViewDidStartLoad:(UIWebView *)webView;
    // webview結(jié)束加載請求之后調(diào)用
    - (void)webViewDidFinishLoad:(UIWebView *)webView;
    // 請求加載中發(fā)生錯誤時調(diào)用
    - (void)webView:(UIWebView *)webView didFailLoadWithError:(nullable NSError *)error;

首先,肯定是從didFailLoadWithError代理方法入手,發(fā)現(xiàn)請求到404頁面時,并沒有調(diào)用該方法,這是為什么呢?原來,該方法時加載過程出現(xiàn)問題調(diào)用,我們順利的得到了404頁面,就不算加載過程的問題。
????然后,從網(wǎng)上搜索該問題,發(fā)現(xiàn)網(wǎng)友提供的方法都是使用sendSynchronousRequest方法返回NSHTTPURLResponse的狀態(tài)碼進行判斷。可是,又出現(xiàn)了一個警告,sendSynchronousRequest在iOS9以后被棄用了,就用新的方法dataTaskWithRequest代理。

 'sendSynchronousRequest:returningResponse:error:' is deprecated: first deprecated in iOS 9.0 - Use [NSURLSession dataTaskWithRequest:completionHandler:]

以上是獲取狀態(tài)碼的方式,具體在哪個代理函數(shù)中處理,還得再看看:
????通過具體代碼分析發(fā)現(xiàn),放在shouldStartLoadWithRequest和webViewDid FinishLoad都可以得到相應(yīng)的狀態(tài)碼,放在webViewDidStartLoad得到的狀態(tài)碼都是0.經(jīng)過分析發(fā)現(xiàn),調(diào)用webViewDidStartLoad方法時,request請求已經(jīng)發(fā)起正在等待服務(wù)器處理結(jié)果。

問題解決

綜上,最終該問題就有兩種處理方式了,分別是sendSynchronousRequest和dataTaskWithRequest。具體代碼如下:

    // 方法一
    NSHTTPURLResponse *response = nil;
    [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];
    NSLog(@"statusCode:%ld", response.statusCode);
     // 方法二
    NSURLSessionDataTask * dataTask = [[NSURLSession sharedSession] dataTaskWithRequest:webView.request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        NSHTTPURLResponse *tmpresponse = (NSHTTPURLResponse*)response;
        NSLog(@"statusCode:%ld", tmpresponse.statusCode);
    }];
    [dataTask resume];

在shouldStartLoadWithRequest和webViewDidFinishLoad方法中都能獲取到該狀態(tài)碼,具體可以根據(jù)業(yè)務(wù)需求確定。
????以上屬于個人代碼分析結(jié)果,如有紕漏,歡迎指正,感激不盡。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容