Alamofire::FAILURE:错误域= NSURLErrorDomain代码= -999“取消”

我要连接的服务是使用自签名证书。 对于开发的目的,我不想validation那个链。

与Alamofire一起使用Swift 3 4.相应地修复ATS:

<key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>url.com</key> <dict> <key>NSExceptionAllowsInsecureHTTPLoads</key> <true/> <key>NSExceptionRequiresForwardSecrecy</key> <false/> <key>NSIncludesSubdomains</key> <true/> </dict> </dict> </dict> 

代码连接并禁用评估。

  let serverTrustPolicies: [String: ServerTrustPolicy] = [ "example.domain.com": .pinCertificates( certificates: ServerTrustPolicy.certificates(), validateCertificateChain: false, validateHost: true ), "sub.url.com": .disableEvaluation ] let sessionManager = Alamofire.SessionManager( serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies) ) let headers = ["Authorization": "Basic /*...*/"] sessionManager.request("https://sub.url.com/path", headers: headers).responseJSON { response in print(response.request) // original URL request print(response.response) // HTTP URL response print(response.data) // server data print(response.result) // result of response serialization debugPrint(response) if let JSON = response.result.value { print("JSON: \(JSON)") } } 

来自dumpPrint的错误日志

[结果]:FAILURE:Error Domain = NSURLErrorDomain Code = -999“cancel”UserInfo = {NSErrorFailingURLKey = https://sub.url.com/path,NSLocalizedDescription = cancel,NSErrorFailingURLStringKey = https://sub.url.com/path }

url已被屏蔽。

请将此语句添加到responseJson块的末尾:

 manager.session.invalidateAndCancel() 

如果pipe理器的对象没有被保留直到块的执行完成,就会发生这种情况,所以这将确保它的保留。

干杯!

要保留SessionManager实例,您需要在传递给responseJSON闭包中捕获它:

 sessionManager.request("https://sub.url.com/path", headers: headers).responseJSON { response in let _ = sessionManager // retain // ... } 

否则, sessionManager将立即解除分配,超出范围并取消任何正在执行的请求。

您需要正确pipe理SessionManager实例的生命周期。 最通常的做法是通过创build一个单例实例。 否则,当您的经理超出范围并被取消时,所有未完成的请求将被取消。

请检查sessiondidReceiveChallenge:委托NSURLSession实现。 机会是NSURLSessionAuthChallengeCancelAuthenticationChallenge在某处执行。

 self.getSessionManager().request(urlstring, method: methods, parameters: parameters, encoding: JSONEncoding.prettyPrinted, headers: Header).responseJSON(queue: nil, options: JSONSerialization.ReadingOptions.allowFragments) { (responseObject) in ... .... }.session.finishTasksAndInvalidate() 

只要在任务完成后放置无效的方法,就意味着session.finishTasksAndInvalidate()