問題描述
在使用webview時,會存在這么一個問題:
如果訪問服務器返回異常,比如404、504這樣的錯誤,需要在native端展示特定的圖片和文案(404、504醬紫的錯誤碼有些不美觀)。那么,問題就來了,怎樣才能知道webview的訪問出錯了,是什么錯???
問題分析
從webview發(fā)起請求之后,能夠查看webview加載狀態(tài)的就是它的代理了,所以就從各個代理方法著手分析。
1
2
3
4
5
6
7
8
|
// webview被指示加載內容時調用,返回YES才會進行加載 - ( BOOL )webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType; // webview已經開始加載一個請求后調用 - ( void )webViewDidStartLoad:(UIWebView *)webView; // webview結束加載請求之后調用 - ( void )webViewDidFinishLoad:(UIWebView *)webView; // 請求加載中發(fā)生錯誤時調用 - ( void )webView:(UIWebView *)webView didFailLoadWithError:(nullable NSError *)error; |
首先,肯定是從didFailLoadWithError代理方法入手,發(fā)現請求到404頁面時,并沒有調用該方法,這是為什么呢?原來,該方法時加載過程出現問題調用,我們順利的得到了404頁面,就不算加載過程的問題。
然后,從網上搜索該問題,發(fā)現網友提供的方法都是使用sendSynchronousRequest方法返回NSHTTPURLResponse的狀態(tài)碼進行判斷??墒牵殖霈F了一個警告,sendSynchronousRequest在iOS9以后被棄用了,就用新的方法dataTaskWithRequest代理。
'sendSynchronousRequest:returningResponse:error:' is deprecated: first deprecated in iOS 9.0 - Use [NSURLSession dataTaskWithRequest:completionHandler:]
以上是獲取狀態(tài)碼的方式,具體在哪個代理函數中處理,還得再看看:
通過具體代碼分析發(fā)現,放在shouldStartLoadWithRequest和webViewDid FinishLoad都可以得到相應的狀態(tài)碼,放在webViewDidStartLoad得到的狀態(tài)碼都是0.經過分析發(fā)現,調用webViewDidStartLoad方法時,request請求已經發(fā)起正在等待服務器處理結果。
問題解決
綜上,最終該問題就有兩種處理方式了,分別是sendSynchronousRequest和dataTaskWithRequest。具體代碼如下:
1
2
3
4
5
6
7
8
9
10
|
// 方法一 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)碼,具體可以根據業(yè)務需求確定。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!