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()