错误代码= -1005“网络连接丢失。”在Swift消费Web服务

问题描述:

我正在Swift 2.0中的一个iOS项目,它具有Web服务调用,这些服务响应速度慢,这是正常的,可以达到1分钟或更多,当我在错误“网络连接丢失”的情况下,70%的响应时间呼叫该服务。测试在模拟器和不同的手机设备和iPad上进行,结果是一样的。网络连接强大,并且在Android上也创建了相同的应用程序,几乎100%的时间都能正常工作。错误代码= -1005“网络连接丢失。”在Swift消费Web服务

我把服务从任何视图的方法如下:

@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() 
} 

显示的错误是:

错误=可选(错误域= NSURLErrorDomain代码= -1005“网络连接丢失。”UserInfo = {NSUnderlyingError = 0x7fbde5f51df0 {错误域= kCFErrorDomainCFNetwork代码= -1005“(空)”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

试图让更多的 “超时”,但这不是看起来像一个暂停。

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

如果您希望某个插座可以一次打开几分钟,那么您将处于一个受到伤害的世界。这可能适用于Wi-Fi,但在蜂窝网络中,由于塔台切换或其他控制之外的随机事件,连接可能性很高。当发生这种情况时,连接会断开,而且您的应用程序对此无能为力。

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

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

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

+0

最后,我们发现问题出在服务器上,因为等待很长时间,并开始在Android设备中进行相同的复制,我认为您提出的架构正是我们需要的,我会实施它,谢谢非常。 –