错误代码= -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或类似的工作来清理尚未收集的旧数据。
使用该模型,与服务器的连接是否关闭并不重要,因为后续请求将成功获取数据。
最后,我们发现问题出在服务器上,因为等待很长时间,并开始在Android设备中进行相同的复制,我认为您提出的架构正是我们需要的,我会实施它,谢谢非常。 –