NSURLDomainError 1005 "The Network Connection Was Lost" 的翻译是“网络连接丢失”。

3

我在新升级到Swift 2.0的项目中依次执行以下两个调用。

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";

然而第二个错误如下:

错误域=NSURLErrorDomain,代码=-1005,“网络连接丢失。” UserInfo={NSUnderlyingError=0x14ffe3cc0 {错误域=kCFErrorDomainCFNetwork,代码=-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=网络连接丢失。}

我无法访问服务器,并尝试使用不同的会话和相同的共享会话发送请求。
有什么想法吗?
2个回答

4

通过使用NSURLConnection而不是NSURLSession解决了此问题。这似乎是由于会话缓存了先前的连接而发生的。


1
这就是错误1005的全部意义——你无法访问服务器。当你向服务器发送请求时,会发生两种情况之一:要么你可以访问服务器并返回状态码,要么你的设备无法与服务器通信,因此服务器无法给你返回状态码。相反,你会得到一个错误,通常是在#1000左右。
这种情况非常罕见,意味着你的设备开始与服务器通信,然后失去了连接(当你下载多兆字节文件时更常见)。想象一下有人从你的Mac中拔出网络电缆,或者想象一下你带着iPad走出WiFi范围,在向服务器发送请求的过程中中断连接。
我建议你将手机切换到“飞行”模式,看看会发生什么——每个请求都会得到类似的错误,并且你应该测试你的应用程序是否能够合理地应对这种情况。当你关闭“飞行”模式时,它也应该恢复到完全功能。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接