2015-09-29 2 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.}) 

I не имеют доступа к сервер и попробовали разные сеансы и один и тот же общий сеанс для отправки запроса.

Любые идеи?

ответ

3

Решен вопрос, используя NSURLConnection вместо NSURLSession. Похоже, что это происходит из-за сеанса кэширования предыдущих подключений.

0

Вот и вся ошибка 1005 - у вас нет доступа к серверу. Когда вы отправляете запрос на сервер, происходит одна из двух вещей: либо вы получаете доступ к серверу, либо возвращается код состояния, либо ваше устройство никогда не справляется с сервером, поэтому сервер не может предоставить вам код состояния. Вместо этого вы получаете ошибку, обычно около # 1000.

Это довольно редко, это означает, что ваше устройство запустило разговор с сервером, а затем потеряло соединение (чаще всего при загрузке файла с несколькими мегабайтами). Представьте, что кто-то вытаскивает сетевой кабель из вашего Mac или представьте, что вы выходите из диапазона WiFi с iPad, посередине запроса на сервер.

Предлагаю вам изменить свой телефон на режим «Самолет» и посмотреть, что произойдет - каждый запрос получит аналогичную ошибку, и вы должны проверить, что ваше приложение выживает достаточно хорошо. Он также должен восстанавливаться до полной функциональности, когда вы выключаете режим «Самолет».

+0

Второй запрос возвращает очень короткое сообщение назад (2 строки). Это происходит независимо от того, что - я полагаю, что это связано с известной проблемой iOS приложения, сохраняющей соединения, если он думает, что он должен поддерживать жизнь c. 30secs. Мне нужна работа для этого, но я не могу найти – HarryParker

Смежные вопросы