错误代码=-1005 “网络连接丢失。”在 Swift 中使用 Web Service

Posted

技术标签:

【中文标题】错误代码=-1005 “网络连接丢失。”在 Swift 中使用 Web Service【英文标题】:Error Code=-1005 "The network connection was lost." in Swift while consuming Web Service 【发布时间】:2016-09-15 18:23:59 【问题描述】:

我正在使用 Swift 2.0 开发一个 ios 项目,该项目具有 Web 服务调用,这些服务响应缓慢,这是正常的,当我调用该服务 70% 时可能长达 1 分钟或更长时间它回答错误“网络连接丢失”的时间。测试是在模拟器和不同的手机设备和 iPad 上进行的,结果是一样的。网络连接很强大,并且同样的应用程序也在 android 上创建并且几乎 100% 的时间都可以正常工作。

我从任何视图调用服务的方式如下:

@IBAction func contratarAct(sender: AnyObject) 
    conexion.delegate = self
    loadingView = MEXLoadingView(delegate: self, title: "Espere por favor", percent: false, view: self.view)
    self.loadingView.showAnimated(true)
    let url = urlServicios.urlBaseServicios + "/" + idSolicitud + "/" + idNoCliente + "/CONTRATO"
    conexion.consultaServicioGET(url, httpMethod: "PUT")

而执行的方法如下:

func consultaServicioGET(url : String, httpMethod : String )
    let urlString = url
    let request = NSMutableURLRequest(URL: NSURL(string: urlString)!)
    request.timeoutInterval = 540
    request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalAndRemoteCacheData
    request.addValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type")

    var session = NSURLSession.sharedSession()
    request.HTTPMethod = httpMethod

    let urlconfig = NSURLSessionConfiguration.defaultSessionConfiguration()
    urlconfig.timeoutIntervalForRequest = 540
    urlconfig.timeoutIntervalForResource = 540
    session = NSURLSession(configuration: urlconfig, delegate: self, delegateQueue: nil)

    let task = session.dataTaskWithRequest(request , completionHandler: 
        (data:NSData?, response:NSURLResponse?, error:NSError?) in

        if error != nil 
            let jsonError : NSDictionary = NSDictionary()
            self.delegate?.respuestaServicioGET!(jsonError, mensaje: "\(error!.localizedDescription)")
            return
        

        let jsonString = NSString(data: data!,encoding: NSASCIIStringEncoding)
        let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding)

        let json: NSDictionary = try! NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as! NSDictionary

        if (json.isKindOfClass(NSDictionary) )
            self.delegate?.respuestaServicioGET!(json, mensaje: "OK")
        else
            let jsonError : NSDictionary = NSDictionary()
            self.delegate?.respuestaServicioGET!(jsonError, mensaje: "ERROR")
        
    )
    task.resume()

显示的错误是:

error=Optional(Error Domain=NSURLErrorDomain Code=-1005 "网络连接丢失。" UserInfo=NSUnderlyingError=0x7fbde5f51df0 Error Domain=kCFErrorDomainCFNetwork Code=-1005 "(null)" UserInfo=_kCFStreamErrorCodeKey=-4 , _kCFStreamErrorDomainKey=4, NSErrorFailingURLStringKey=https://particulares-gw-obparticularesmx-pre.appls.cto2.paas.gsnetcloud.com:443/OPB/57dadf7de4b0ac2e518de44a/57dadf7de4b06c6b04ef0dcf/CONTRATO, NSErrorFailingURLKey=https://particulares-gw-obparticularesmx-pre.appls.cto2.paas.gsnetcloud.com:443/OPB/57dadf7de4b0ac2e518de44a/57dadf7de4b06c6b04ef0dcf/CONTRATO, _kCFStreamErrorDomainKey=4, _kCFStreamErrorCodeKey=-4, NSLocalizedDescription=网络连接丢失。)

我添加如下代码:

urlconfig.timeoutIntervalForRequest = 540 urlconfig.timeoutIntervalForResource = 540

试图获得更多“超时”,但这看起来不像是超时。

我好几天都无法摆脱这个错误,任何帮助将不胜感激。我很绝望。

【问题讨论】:

【参考方案1】:

如果您希望插座一次保持打开几分钟,那么您将面临一个痛苦的世界。这可能适用于 Wi-Fi,但在蜂窝网络上,由于塔切换或您无法控制的其他一些随机事件,连接故障的可能性很高。发生这种情况时,连接会断开,您的应用确实无能为力。

这确实需要通过更改客户端请求数据的方式来解决,以便响应可以更加异步。具体来说:

提出您的要求。 在服务器端,立即为客户端提供该请求的唯一标识符并关闭连接。 接下来,在客户端,定期向服务器询问其状态。 如果连接超时,请再次询问。 如果服务器说结果还没有准备好,请等待几秒钟,然后再次询问。 在服务器端,处理完成后,将结果与标识符一起以持久的方式存储(例如,在文件或数据库中) 当客户端请求该标识符的结果时,如果结果准备好则返回结果,或者返回某种“未准备好”错误。 在服务器端执行定期 cron 作业或类似作业,以清理尚未收集的旧数据。

使用该模型,与服务器的连接是否关闭无关紧要,因为后续请求将成功获取数据。

【讨论】:

最后我们发现问题出在服务器上,因为等待时间很长,并开始在安卓设备中复制相同的问题,我认为你提出的架构正是我们需要的,我会的执行一下,非常感谢。【参考方案2】:

我遇到了同样的问题,我附上了解决方案的屏幕截图,以显示我是如何解决问题的。

在我的例子中,问题在于 API 请求被服务器 Sucuri/Cloudproxy(或者您可以说防火墙服务)阻止。禁用防火墙解决了这个问题

【讨论】:

【参考方案3】:

我不知道为什么,但是当我在请求之前添加睡眠时它会起作用:

sleep(10000) 

    AF.request(ViewController.URL_SYSTEM+"/rest,get_profile", method: .post, parameters: params, encoding: JSONEncoding.default , headers: headers).responseJSON  (response) in
                    

【讨论】:

【参考方案4】:

我遇到了这个问题并花了超过 1 周的时间来解决这个问题。而且我刚刚通过更改 Wifi 连接解决了这个问题。

【讨论】:

以上是关于错误代码=-1005 “网络连接丢失。”在 Swift 中使用 Web Service的主要内容,如果未能解决你的问题,请参考以下文章

错误代码=-1005 “网络连接丢失。”在 Swift 中使用 Web Service

错误域= NSURLErrorDomain代码= -1005“网络连接丢失。”

为啥 NSURLConnection 失败,错误 Domain=NSURLErrorDomain Code=-1005 “网络连接丢失。”在 Swift iOS8 中?

网络连接丢失。NSURLErrorDomain Code=-1005

NSURLConnection GET 请求返回 -1005,“网络连接丢失”

使用 NSURLSessionUploadTask 上传视频。错误“网络连接丢失。”