我正在连接的服务是使用自签名证书。 出于开发目的,我不想验证该链。
将swift 3与Alamofire 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的错误日志
[Result]:FAILURE:Error Domain = NSURLErrorDomain Code = -999“cancelled” 的UserInfo = {NSErrorFailingURLKey = https://sub.url.com/path, NSLocalizedDescription =取消, NSErrorFailingURLStringKey = https://sub.url.com/path}
网址已被屏蔽。
答案 0 :(得分:8)
请将此语句添加到responseJson块的末尾:
manager.session.invalidateAndCancel()
如果在块的执行完成之前未保留管理器的对象,则会发生这种情况,因此这将确保其保留。
干杯!
答案 1 :(得分:8)
要保留SessionManager
个实例,您需要在传递给responseJSON
的闭包中捕获它:
sessionManager.request("https://sub.url.com/path", headers: headers).responseJSON { response in
let _ = sessionManager // retain
// ...
}
否则sessionManager
很快被解除分配,超出范围,任何正在执行的请求都会被取消。
答案 2 :(得分:2)
请检查let locale = Locale.current
let countries = Locale.isoRegionCodes.map {
locale.localizedString(forRegionCode: $0)!
}.sorted()
代理sessiondidReceiveChallenge:
的实施情况。机会NSURLSession
正在某处执行。
答案 3 :(得分:1)
您需要正确管理SessionManager
实例的生命周期。最常见的是通过创建单例实例来完成。否则,当您的经理超出范围且deinit
时,所有未完成的请求都将被取消。
答案 4 :(得分:1)
self.getSessionManager().request(urlstring, method: methods, parameters: parameters, encoding: JSONEncoding.prettyPrinted, headers: Header).responseJSON(queue: nil, options: JSONSerialization.ReadingOptions.allowFragments) { (responseObject) in ... .... }.session.finishTasksAndInvalidate()
在任务完成后输入invalidate方法,意味着session.finishTasksAndInvalidate()