原文:http://www.henishuo.com/nsurlerrordomain-code-999/

前言

今天有一个线上bug,是分配给提供H5的团队的,但是后台查不出来原因。于是让前端iOS帮忙查一查原因。

今天,交给我来帮忙查原因,但是问题在网络好的状态下并不必现,很难去定位问题的根本原因。最后只能到测试旁边连接测试专用的慢网环境,然后才能必现。

刚进入界面时是加载一个H5页面,当点击H5页面上的某个按钮的时候,会通过webview拦截到scheme,然后去走接口请求数据,得到数据后再加载H5页面。此时,走了webview加载失败的回调。

加断点,打印出来的error信息是:

 
Error Domain=NSURLErrorDomain Code=-999 “The operationcouldn’t becompleted.
 

然后,笔者进入NSURLError.h中查看-999代表什么对应的key是什么:

 
NS_ENUM(NSInteger)
{
    NSURLErrorUnknown =            -1,
    NSURLErrorCancelled =          -999,
    NSURLErrorBadURL =              -1000,
    NSURLErrorTimedOut =            -1001,
    NSURLErrorUnsupportedURL =          -1002,
    NSURLErrorCannotFindHost =          -1003,
    NSURLErrorCannotConnectToHost =        -1004,
    NSURLErrorNetworkConnectionLost =      -1005,
    NSURLErrorDNSLookupFailed =        -1006,
    NSURLErrorHTTPTooManyRedirects =        -1007,
    NSURLErrorResourceUnavailable =        -1008,
    NSURLErrorNotConnectedToInternet =      -1009,
    NSURLErrorRedirectToNonExistentLocation =  -1010,
    NSURLErrorBadServerResponse =      -1011,
    NSURLErrorUserCancelledAuthentication =    -1012,
    NSURLErrorUserAuthenticationRequired =  -1013,
    NSURLErrorZeroByteResource =        -1014,
    NSURLErrorCannotDecodeRawData =            -1015,
    NSURLErrorCannotDecodeContentData =        -1016,
    NSURLErrorCannotParseResponse =            -1017,
    NSURLErrorAppTransportSecurityRequiresSecureConnection NS_ENUM_AVAILABLE(10_11, 9_0) = -1022,
    NSURLErrorFileDoesNotExist =        -1100,
    NSURLErrorFileIsDirectory =        -1101,
    NSURLErrorNoPermissionsToReadFile =    -1102,
    NSURLErrorDataLengthExceedsMaximum NS_ENUM_AVAILABLE(10_5, 2_0) =  -1103,
    
    // SSL errors
    NSURLErrorSecureConnectionFailed =      -1200,
    NSURLErrorServerCertificateHasBadDate =    -1201,
    NSURLErrorServerCertificateUntrusted =  -1202,
    NSURLErrorServerCertificateHasUnknownRoot = -1203,
    NSURLErrorServerCertificateNotYetValid =    -1204,
    NSURLErrorClientCertificateRejected =  -1205,
    NSURLErrorClientCertificateRequired =  -1206,
    NSURLErrorCannotLoadFromNetwork =      -2000,
    
    // Download and file I/O errors
    NSURLErrorCannotCreateFile =        -3000,
    NSURLErrorCannotOpenFile =          -3001,
    NSURLErrorCannotCloseFile =        -3002,
    NSURLErrorCannotWriteToFile =      -3003,
    NSURLErrorCannotRemoveFile =        -3004,
    NSURLErrorCannotMoveFile =          -3005,
    NSURLErrorDownloadDecodingFailedMidStream = -3006,
    NSURLErrorDownloadDecodingFailedToComplete =-3007,
 
    NSURLErrorInternationalRoamingOff NS_ENUM_AVAILABLE(10_7, 3_0) =        -1018,
    NSURLErrorCallIsActive NS_ENUM_AVAILABLE(10_7, 3_0) =                    -1019,
    NSURLErrorDataNotAllowed NS_ENUM_AVAILABLE(10_7, 3_0) =                  -1020,
    NSURLErrorRequestBodyStreamExhausted NS_ENUM_AVAILABLE(10_7, 3_0) =      -1021,
    
    NSURLErrorBackgroundSessionRequiresSharedContainer NS_ENUM_AVAILABLE(10_10, 8_0) = -995,
    NSURLErrorBackgroundSessionInUseByAnotherProcess NS_ENUM_AVAILABLE(10_10, 8_0) = -996,
    NSURLErrorBackgroundSessionWasDisconnected NS_ENUM_AVAILABLE(10_10, 8_0)= -997,
};
 

找到了吧!!!NSURLErrorCancelled就是-999,它代表请求被取消的意思。

根本原因

出现NSURLErrorDomain Code=-999的根本原因是什么呢?其实就是因为webview在之前的请求还没有加载完成,下一个请求发起了,此时webview会取消掉之前的请求,因此会回调到失败这里。

因此,在处理Webview的加载失败的回调时,要注意拦截掉被取消的请求。

解决方案

在webview加载失败时,添加如下代码来判断:

 
- (void)webView:(UIWebView *)webViewdidFailLoadWithError:(NSError *)error {
  [self stopAnimating];
  
  // 如果是被取消,什么也不干
  if([errorcode] == NSURLErrorCancelled)  {
    return;
  }
  
  // 后续失败处理
}
 

最后

如果大家遇到同样的问题,请不要着急,这个bug不一定是后台的,也不一定是前端的,因此彼此应该要互相配合,共同找到问题的根本原因。

由于安卓也有同样的问题,但是复现率没有iOS的高,在笔者找出根本原因后,H5人员与安卓端描述,希望安卓端也能统一改,但是描述不清楚,导致安卓这边有意见。于是叫笔者过来帮忙解释原因,讲了半天,安卓的leader说不可能~不会的~不应该~不影响~

发现跟安卓沟通要是不懂一点安卓,真心容易被人忽悠。当然,最后还是要改的,事实都摆在面前了,还能有什么借口可以逃避!

希望大家在遇到同样的问题时,淡定!沟通协作共同解决问题。

NSURLErrorDomain Code=-999(转)的更多相关文章

  1. 'Error Domain=NSURLErrorDomain Code=-999' AFNetworking请求报错

    早上请求app请求登录接口发现了下面的错误信息: Error Domain=NSURLErrorDomain Code=-999 "已取消" UserInfo={NSErrorFa ...

  2. Error Domain=NSURLErrorDomain Code=-999 “The operation couldn’t be completed.

    转:http://www.wangzhengdong.com/blog/error-domainnsurlerrordomain-code-999-the-operation-couldnt-be-c ...

  3. 关于https的Error:Error Domain=NSURLErrorDomain Code=-1012

    昨天闲着没事就随便搞点demo,随便找了一个https的接口,运行之后,一直发现Error Domain=NSURLErrorDomain Code=-1012.好奇怪,请求https的配置我基本都配 ...

  4. Finish and error to: Error Domain=NSURLErrorDomain Code=-1001 "请求超时。

    错误显示:Finish and error to: Error Domain=NSURLErrorDomain Code=-1001 "请求超时." UserInfo={NSUnd ...

  5. iOS9 Error Domain=NSURLErrorDomain Code=-1022 App Transport Security (ATS)

    iOS 9在HTTP 访问时会出错  iOS9 Error Domain=NSURLErrorDomain Code=-1022 这时需要修改info.plist 文件 在Info.plist中添加N ...

  6. 真机调试报错error ==Error Domain=NSURLErrorDomain Code=-1009 "似乎已断开与互联网的连接。"

    真机调试报错error ==Error Domain=NSURLErrorDomain Code=-1009 "似乎已断开与互联网的连接." 请注意,错误代码是-1009,网上关于 ...

  7. [奇葩问题] Error Domain=NSURLErrorDomain Code=-1003

    问题描述: 新上线的产品,ios同事拿着一串报错来找我,日志如下:err =Error Domain=NSURLErrorDomain Code=-1003 "未能找到使用指定主机名的服务器 ...

  8. iOS SDWebImage Error Domain=NSURLErrorDomain Code=-1202 “此服务器的证书无效

    sdwebImage 加载网络图片的时候,如果使用的https证书未经过认证,或者证书有问题,会出现Error Domain=NSURLErrorDomain Code=-1202 "此服务 ...

  9. error=Error Domain=NSURLErrorDomain Code=-1003

    我的情况:模拟器 可以返回数据 .真机不可以.我手机连接的同事的共享,我以为他的网段和后台的网段在同一个网段.一直在找错误,打开手机网络设置一看  ,原来不在同一网段.手机的网络必须要跟PC的在同一个 ...

随机推荐

  1. 微软URLRewriter.dll的url重写的简单使用(实现伪静态)

    先添加引用URLRewriter.dll到项目下的bin目录中,下载: http://files.cnblogs.com/tianguook/URLRewriter.rar 1.在web.config ...

  2. DD_belatedPNG

    我们知道IE6是不支持透明的PNG的,这无疑限制了网页设计的发挥空间. 然而整个互联网上解决这个IE6的透明PNG的方案也是多不胜数,从使用IE特有的滤镜或是e­xpression,再到javascr ...

  3. 锁Lock的概念

    并发访问同一资源的功能,需要引入锁Lock的概念,也就是说,某个时刻,当有一个访问类访问这个数据对象时,这个数据对象必须上锁Locked,用完后就立即解锁unLocked,再供其它访问类访问.

  4. LoadRunner录制:脚本调试

    优化思路 1. 先录制 2. 然后进行清理.清理掉多余的cookie.lr_think_time等冗余脚本. 3. 调试脚本,让脚本可以跑通过. 4. 逐步优化添加 调试思路 1. 单用户单迭代 录制 ...

  5. Scala数据类型中的Symbol(符号文本)

    1.属于基本类型,被映射成scala.Symbol 2.当两个Symbol值相等时,指向同一个实例 3.Symbol类型存在的意义:作为不可变的字符串,同时不必重复地为相同对象创建实例,节省资源.这类 ...

  6. python2.7里的StringIO.StringIO与BytesIO有什么区别

    import StringIO与from io import BytesIO的区别 open()函数返回的文件对象取决于模式.当使用文本模式打开文件时,它返回一个TextIOBase的子类.当使用二进 ...

  7. Ubuntu14.04怎样使用root登录

    1.打开终端 2.sudo gedit /usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf 3.在弹出的编辑框里输入:greeter-show-manua ...

  8. Wait--使用sys.dm_io_virtual_file_stats来查看IO延迟

    /*============================================================================ File: VirtualFileStat ...

  9. 关于RHEL6下桥网配置的写法(ifcfg-eth0,ifcfg-br0) / 在阿里云的CentOS上安装docker

    Posted on 2011-07-28 16:46 zhousir1991 阅读(1978) 评论(0) 编辑 收藏 以下仅仅是我在做练习的时候下的环境,参照写即可:  [root@desktop2 ...

  10. cocos2d-x 源代码分析 : EventDispatcher、EventListener、Event 源代码分析 (新触摸机制,新的NotificationCenter机制)

    源代码版本号来自3.x,转载请注明 cocos2d-x 源代码分析总文件夹 http://blog.csdn.net/u011225840/article/details/31743129 1.继承结 ...