IOS UIWebView獲取404、504等錯(cuò)誤問題解決方案
UIWebView獲取404、504等錯(cuò)誤碼
問題描述
在使用webview時(shí),會(huì)存在這么一個(gè)問題:
如果訪問服務(wù)器返回異常,比如404、504這樣的錯(cuò)誤,需要在native端展示特定的圖片和文案(404、504醬紫的錯(cuò)誤碼有些不美觀)。那么,問題就來了,怎樣才能知道webview的訪問出錯(cuò)了,是什么錯(cuò)???
問題分析
從webview發(fā)起請(qǐng)求之后,能夠查看webview加載狀態(tài)的就是它的代理了,所以就從各個(gè)代理方法著手分析。
// webview被指示加載內(nèi)容時(shí)調(diào)用,返回YES才會(huì)進(jìn)行加載 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType; // webview已經(jīng)開始加載一個(gè)請(qǐng)求后調(diào)用 - (void)webViewDidStartLoad:(UIWebView *)webView; // webview結(jié)束加載請(qǐng)求之后調(diào)用 - (void)webViewDidFinishLoad:(UIWebView *)webView; // 請(qǐng)求加載中發(fā)生錯(cuò)誤時(shí)調(diào)用 - (void)webView:(UIWebView *)webView didFailLoadWithError:(nullable NSError *)error;
首先,肯定是從didFailLoadWithError代理方法入手,發(fā)現(xiàn)請(qǐng)求到404頁面時(shí),并沒有調(diào)用該方法,這是為什么呢?原來,該方法時(shí)加載過程出現(xiàn)問題調(diào)用,我們順利的得到了404頁面,就不算加載過程的問題。
然后,從網(wǎng)上搜索該問題,發(fā)現(xiàn)網(wǎng)友提供的方法都是使用sendSynchronousRequest方法返回NSHTTPURLResponse的狀態(tài)碼進(jìn)行判斷??墒?,又出現(xiàn)了一個(gè)警告,sendSynchronousRequest在iOS9以后被棄用了,就用新的方法dataTaskWithRequest代理。
'sendSynchronousRequest:returningResponse:error:' is deprecated: first deprecated in iOS 9.0 - Use [NSURLSession dataTaskWithRequest:completionHandler:]
以上是獲取狀態(tài)碼的方式,具體在哪個(gè)代理函數(shù)中處理,還得再看看:
通過具體代碼分析發(fā)現(xiàn),放在shouldStartLoadWithRequest和webViewDid FinishLoad都可以得到相應(yīng)的狀態(tài)碼,放在webViewDidStartLoad得到的狀態(tài)碼都是0.經(jīng)過分析發(fā)現(xiàn),調(diào)用webViewDidStartLoad方法時(shí),request請(qǐng)求已經(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ù)需求確定。
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
Swift 進(jìn)階 —— map 和 flatMap的使用
這篇文章主要介紹了Swift map和flatMap的相關(guān)資料,幫助大家更好的理解和使用Swift,感興趣的朋友可以了解下2020-09-09
iOS自定義UIButton點(diǎn)擊動(dòng)畫特效
這篇文章主要為大家詳細(xì)介紹了iOS自定義UIButton點(diǎn)擊動(dòng)畫特效,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04
C++ 中exit(),_exit(),return,abort()函數(shù)的區(qū)別
這篇文章主要介紹了C++ 中exit(),_exit(),return,abort()函數(shù)的區(qū)別的相關(guān)資料,需要的朋友可以參考下2016-12-12
iOS開發(fā)中蘋果輸入手機(jī)號(hào)變用戶的名字
今天我們的用戶輸入手機(jī)號(hào)之后變成了用戶的名字,沒辦法獲取驗(yàn)證碼,因?yàn)槭謾C(jī)格式不對(duì)。下面通過本文給大家分享開發(fā)中蘋果輸入手機(jī)號(hào)變用戶的名字,需要的朋友可以參考下2017-05-05
IOS 開發(fā)之 NSMutableArray與NSArray 的區(qū)別
這篇文章主要介紹了IOS 開發(fā)之 NSMutableArray與NSArray 的區(qū)別的相關(guān)資料,希望通過本文能掌握這部分內(nèi)容,需要的朋友可以參考下2017-09-09
IOS 開發(fā)之swift中UIView的擴(kuò)展使用的實(shí)例
這篇文章主要介紹了IOS 開發(fā)之swift中UIView的擴(kuò)展使用的實(shí)例的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下2017-09-09

