2015-09-29 252 views
2

我在新升级到Swift 2.0项目中接连执行下列两个调用。NSURLDomainError 1005“网络连接丢失”

let session = NSURLSession.sharedSession() 
    authRequest.HTTPMethod = "POST" 
    authRequest.HTTPBody = authData 
    authRequest.addValue("application/json", forHTTPHeaderField: "Content-Type") 
    authRequest.addValue("close", forHTTPHeaderField: "Connection") 
    authRequest.addValue("application/json", forHTTPHeaderField: "Accept") 
    let authTask = session.dataTaskWithRequest(authRequest, completionHandler: { (data : NSData?, response : NSURLResponse? , error : NSError?) -> Void in 
     print("Response: \(response)") 
     print("Error: \(error)") 
     let strData = NSString(data: data!, encoding: NSUTF8StringEncoding) 
     print("Body: \(strData)") 
     if let httpResponse = response as? NSHTTPURLResponse 
     { 
      if 200 ... 299 ~= httpResponse.statusCode 
      { 
       do 
       { 
       result = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableLeaves) as! Dictionary 
       credentials.ClientId = (result["client_id"] as String?)! 
       credentials.ClientSecret = (result["client_secret"] as String?)! 
       credentials.Username = userDetail.Username 
       credentials.Password = userDetail.Password 
        completionHandler(result: true) 
           } 
       catch { 

       } 
      } 
      else 
      { 
       self.RemoveInvalidUserCredentials() 
       completionHandler(result: false) 
      } 

     } 

     }) 
     authTask.resume() 

跟:

let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration()) 
    session.configuration.URLCache = nil 
    session.configuration.HTTPMaximumConnectionsPerHost = 1 
    tokenRequest.HTTPBody = tokenData 
    tokenRequest.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") 
    tokenRequest.addValue("close", forHTTPHeaderField: "Connection") 
    tokenRequest.addValue("Basic " + (credentials.encodedClientIdAndSecret() as String), forHTTPHeaderField: "Authorization") 
    let tokenTask = session.dataTaskWithRequest(tokenRequest, completionHandler: {(data : NSData?, response : NSURLResponse? , error : NSError?) -> Void in 
     print("Response: \(response)") 
     print("Error: \(error)") 
     let strData = NSString(data: data!, encoding: NSUTF8StringEncoding) 
     print("Body: \(strData)") 
     if let httpResponse = response as? NSHTTPURLResponse { 
      if 200 ... 299 ~= httpResponse.statusCode 
      { 
       do 
       { 
       result = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableLeaves) as! Dictionary 
       credentials.TokenType = (result["token_type"] as! String?)! 
       credentials.Token = (result["access_token"] as! String?)! 
       completionHandler(result: true) 
       } 
       catch{} 
      } 
     } 
    }) 
    tokenTask.resume() 

的第一码块正确执行并返回以下结果:

Response: Optional(<NSHTTPURLResponse: 0x14ffe3e60> { URL: <URL>/authorize } { status code: 200, headers { 
"Cache-Control" = "no-cache"; 
"Content-Length" = 115; 
"Content-Type" = "application/json; charset=utf-8"; 
Date = "Tue, 29 Sep 2015 14:17:52 GMT"; 
Expires = "-1"; 
Pragma = "no-cache"; 
Server = "Microsoft-IIS/7.5"; 
"Set-Cookie" = ".AspNet.ApplicationCookie=E98BMJ5l56psnnJZRy2fyhRTWVYqw4aJsFqPeV1ktkJGi5_frTJ9-8pbp28TcDAn9ISFj_LqwFwOV7WhP1mfTVPktTGTs2Dr5-hvmnISxFVRc1Rg9CcYf3p-Cbn1w6qOEyuXco9PCmCnlsf54KPuSY6Z7FEcUgOyg2nq5oDyamfB_Y4b1dI-7cIZ3LB6ehoI50rIbc2ca7L7f73H1rhbsmuLRarBYsYehSRHRuKs9ec5-XuN0P1W6yqiQ3OOJMayPmmbi6y4uIhBUu0zoRC2v3k9usmRjubxGy2hqf6n0baTOIDokav0wQq_smR9qDA6nNh09YTS1Mzvf0iQPS2YJa7QrnERlNSixDROhkQVLC8hc3GV8jc9_7iGUhJzLgeVzhnjnVeB7Z311QLcXxGonEzzcWAzPu29tm2LkZgdte4J0kQHc-iTiNjSbgBqV2zVH9v_0JHtZCFGdSxSGptXGfsPr5O9M-EyVX2UNXxIsVI-hfv3p8-_igV96phbWsvWyqyYhVMQ8v61vHxfO2CFIQ; path=/; secure; HttpOnly"; 
"X-Powered-By" = "ASP.NET"; 

然而第二个有此错误:

Optional(Error Domain=NSURLErrorDomain Code=-1005 "The network connection was lost." UserInfo={NSUnderlyingError=0x14ffe3cc0 {Error Domain=kCFErrorDomainCFNetwork Code=-1005 "(null)" UserInfo={_kCFStreamErrorCodeKey=-4, _kCFStreamErrorDomainKey=4}}, NSErrorFailingURLStringKey=https://test.acumentive.com/tagmanager/api/v1/tokens, NSErrorFailingURLKey=https://test.acumentive.com/tagmanager/api/v1/tokens, _kCFStreamErrorDomainKey=4, _kCFStreamErrorCodeKey=-4, NSLocalizedDescription=The network connection was lost.}) 

我无法访问服务器并尝试了不同的会话和相同的共享会话来发送请求。

任何想法?

回答

3

通过使用NSURLConnection而不是NSURLSession解决了该问题。由于会话缓存了以前的连接,似乎正在发生。

0

这就是错误1005的全部内容 - 您无法访问服务器。向服务器发送请求时,会发生以下两种情况之一:要么访问服务器并返回状态码,要么设备永远无法与服务器交谈,因此服务器无法为您提供状态码。相反,你会得到一个错误,通常在#1000左右。

这是非常罕见的,这意味着您的设备开始与服务器交谈,然后失去连接(下载多兆字节文件时更常见)。想象一下,有人从你的Mac中拉出网络电缆,或者想象你在向服务器发送请求的过程中,用iPad从WiFi范围走出。

我建议您将手机更改为“飞机”模式并查看会发生什么 - 每个请求都会得到类似的错误,并且您应该测试您的应用是否能够相当好地存活下来。当您关闭“飞机”模式时,它也应该恢复到全部功能。

+0

第二个请求返回一个非常短的消息(2个字符串)。无论发生什么,都会发生这种情况 - 如果它认为它应该为c保持活动状态,我相信它会与已知的iOS应用程序保存连接相关联。 30secs。我需要一个解决方法,但似乎无法找到一个 – HarryParker

相关问题