时间:2021-05-20
UIWebView获取404、504等错误码
问题描述
在使用webview时,会存在这么一个问题:
如果访问服务器返回异常,比如404、504这样的错误,需要在native端展示特定的图片和文案(404、504酱紫的错误码有些不美观)。那么,问题就来了,怎样才能知道webview的访问出错了,是什么错???
问题分析
从webview发起请求之后,能够查看webview加载状态的就是它的代理了,所以就从各个代理方法着手分析。
// webview被指示加载内容时调用,返回YES才会进行加载 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType; // webview已经开始加载一个请求后调用 - (void)webViewDidStartLoad:(UIWebView *)webView; // webview结束加载请求之后调用 - (void)webViewDidFinishLoad:(UIWebView *)webView; // 请求加载中发生错误时调用 - (void)webView:(UIWebView *)webView didFailLoadWithError:(nullable NSError *)error; 首先,肯定是从didFailLoadWithError代理方法入手,发现请求到404页面时,并没有调用该方法,这是为什么呢?原来,该方法时加载过程出现问题调用,我们顺利的得到了404页面,就不算加载过程的问题。
然后,从网上搜索该问题,发现网友提供的方法都是使用sendSynchronousRequest方法返回NSHTTPURLResponse的状态码进行判断。可是,又出现了一个警告,sendSynchronousRequest在iOS9以后被弃用了,就用新的方法dataTaskWithRequest代理。
'sendSynchronousRequest:returningResponse:error:' is deprecated: first deprecated in iOS 9.0 - Use [NSURLSession dataTaskWithRequest:completionHandler:]
以上是获取状态码的方式,具体在哪个代理函数中处理,还得再看看:
通过具体代码分析发现,放在shouldStartLoadWithRequest和webViewDid FinishLoad都可以得到相应的状态码,放在webViewDidStartLoad得到的状态码都是0.经过分析发现,调用webViewDidStartLoad方法时,request请求已经发起正在等待服务器处理结果。
问题解决
综上,最终该问题就有两种处理方式了,分别是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方法中都能获取到该状态码,具体可以根据业务需求确定。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
前言本文主要探讨集群后不同Web服务器获取Session数据的问题解决方案。SessionStickSessionStick方案即将客户端的每次请求都转发至同一
先看解决方案#------------mysqlroot用户无法赋权问题解决--------1,登录mysql-uroot-p2,usemysql;选择mysq
问题:使用keep-alive标签后部分安卓机返回缓存页位置不精确问题解决方案:constrouter=newRouter({scrollBehavior(to
IOS下获取rootviewcontroller的版本不同的问题解决办法一般原生的[[UIApplicationsharedApplication].keyWi
解决方案1:禁用缓存,前一次使用的方法,在电脑上各浏览器都没问题,但在ipad、安卓手机上仍有问题解决方案2:禁用浏览器后退键javascript:window