IOS UIWebView获取404、504等错误问题解决方案

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方法中都能获取到该状态码,具体可以根据业务需求确定。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • iOS中UIWebView网页加载组件的基础及使用技巧实例

    基本用法示例 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. UIWebView * webView = [[UIWebView alloc]initWithFrame:CGRectMake(0, 20, ScreenWidth, ScreenHeight-20)]; // 自动队页面进行缩放以适应屏幕 webView.scalesPageToFit = Y

  • IOS中UIWebView的使用详解

    一.初始化与三种加载方式 UIWebView继承与UIView,因此,其初始化方法和一般的view一样,通过alloc和init进行初始化,其加载数据的方式有三种: 第一种: - (void)loadRequest:(NSURLRequest *)request; 这是加载网页最常用的一种方式,通过一个网页URL来进行加载,这个URL可以是远程的也可以是本地的,例如我加载百度的主页: UIWebView * view = [[UIWebView alloc]initWithFrame:self.

  • IOS之UIWebView的使用(基本知识)

    刚接触IOS开发1年多,现在对于混合式移动端开发越来越流行,因为开发成本上.速度上都比传统的APP开发要好,混合式开发是传统模式与PC网页端相结合的模式.那么提到了 APP的混合模式开发,在Android开发中有WebView作为混合模式开发的桥梁,当然在IOS中也同样有一个 UIWebView 组件来作为混合模式开发的桥梁,那么下面就对UIWebView的一些基本知识详解一下. 一.UIWebView的基础使用 1.创建UIWebView: CGRect bouds = [[UIScreen

  • 在iOS应用中使用UIWebView创建简单的网页浏览器界面

    UIWebView是iOS sdk中一个最常用的控件.是内置的浏览器控件,我们可以用它来浏览网页.打开文档等等.这篇文章我将使用这个控件,做一个简易的浏览器.如下图: 我们创建一个Window-based Application程序命名为:UIWebViewDemo UIWebView的loadRequest可以用来加载一个url地址,它需要一个NSURLRequest参数.我们定义一个方法用来加载url.在UIWebViewDemoViewController中定义下面方法: 复制代码 代码如

  • IOS中使用UIWebView 加载网页、文件、 html的方法

    UIWebView 是用来加载加载网页数据的一个框.UIWebView可以用来加载pdf word doc 等等文件 生成webview 有两种方法: 1.通过storyboard 拖拽 2.通过alloc init 来初始化 创建webview,下列文本中 _webView.dataDetectorTypes = UIDataDetectorTypeAll; 是识别webview中的类型,例如 当webview中有电话号码,点击号码就能直接打电话 - (UIWebView *)webView

  • 实例详解IOS开发之UIWebView

    iOS开发之UIWebView 是本文要介绍的内容,UIWebView是iOS sdk中一个最常用的控件.是内置的浏览器控件,我们可以用它来浏览网页.打开文档等等.这篇文章我将使用这个控件,做一个简易的浏览器.如下图: 我们创建一个Window-based Application程序命名为:UIWebViewDemo UIWebView的loadRequest可以用来加载一个url地址,它需要一个NSURLRequest参数.我们定义一个方法用来加载url.在UIWebViewDemoViewC

  • iOS之UIWebView无法获取web标题的解决方法

    最近遇到了一个问题,就是在UIWebView的代理方法里,执行document.title的js代码无法获取网页标题,代码如下: - (void)webViewDidFinishLoad:(UIWebView *)webView { // 取加载html文件的标题名 NSString *title = [webView stringByEvaluatingJavaScriptFromString:@"document.title"]; } 出现这个问题,我首先确定是不是代码的问题,经过

  • iOS开发中使用UIWebView 屏蔽 alert警告框

    如果是网页内容里面的alert,我们可以等网页加载完毕,也就是在webViewDidFinishLoad中执行下面的js代码,就可以屏蔽alert了 [myWebView stringByEvaluatingJavaScriptFromString:@"window.alert=null;"]; 但上面的方法对于网页onLoad事件里面的alert就不起作用了 解决方法就是给UIWebView添加一个类别: 给工程添加JavaScriptAlert.h @interface UIWeb

  • IOS中UIWebView加载Loading的实现方法

    第一种方法:使用UIView and UIActivityIndicatorView 复制代码 代码如下: //创建UIWebView WebView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 44, 320, 400)]; [WebView setUserInteractionEnabled:NO]; [WebView setBackgroundColor:[UIColor clearColor]]; [WebView setDelega

  • iOS UIWebView实现禁止用户复制剪切功能

    前言 在APP的混合模式开发,Android开发中有WebView作为混合模式开发的桥梁,当然在IOS中也同样有一个 UIWebView 组件来作为混合模式开发的桥梁,用过UIWebView组件的开发者都知道,当UIWebView加载显示HTML页面时,组件本身提供了一些系统默认的交互行为,这篇文章给大家分享的是iOS UIWebView实现禁止用户复制剪切功能,下面来一起看看. 示例代码 // 控制器实现此方法 - (BOOL)canPerformAction:(SEL)action with

随机推荐