我正在使用Swift 2.0中的iOS项目,该项目有Web服务调用,这些服务响应缓慢,这是正常的,当我调用服务时可能长达1分钟或更多70%的时间它回答错误"网络连接丢失。"测试是在模拟器和不同的电话设备和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 =可选(错误域= NSURLErrorDomain代码= -1005"网络连接丢失。" UserInfo = {NSUnderlyingError = 0x7fbde5f51df0 {错误域= kCFErrorDomainCFNetwork代码= -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
试图获得更多"超时"但这看起来不像是超时。
我几天都无法摆脱这个错误,任何帮助都将不胜感激。我绝望了。
答案 0 :(得分:1)
如果您希望套接字一次保持打开几分钟,那么您将面临一个受伤的世界。这可能适用于Wi-Fi,但在蜂窝网络上,由于塔式切换或您控制之外的其他随机事件,连接故障的可能性很高。当发生这种情况时,连接就会消失,而且你的应用程序对此无能为力。
这确实需要通过更改客户端请求数据的方式来修复,以便响应可以更加异步。具体做法是:
使用该模型,与服务器的连接是否关闭无关紧要,因为后续请求将成功获取数据。
答案 1 :(得分:1)
我遇到了同样的问题,并且附上了解决方案的屏幕截图,以显示如何解决该问题。
就我而言,问题是来自服务器Sucuri / Cloudproxy的API请求被阻止(或者可以说是防火墙服务)。禁用防火墙解决了该问题
答案 2 :(得分:0)
我不知道为什么,但是当我在请求之前添加睡眠时它会起作用:
sleep(10000)
AF.request(ViewController.URL_SYSTEM+"/rest,get_profile", method: .post, parameters: params, encoding: JSONEncoding.default , headers: headers).responseJSON { (response) in
}
答案 3 :(得分:-2)
我遇到了这个问题,花了1个多星期来解决。而且我只是通过更改Wifi连接来解决此问题。