Alamofire:[Result]:FAILURE:Error Domain = NSURLErrorDomain Code = -999“cancelled”

时间:2016-10-11 19:07:47

标签: ios swift xcode alamofire

我正在连接的服务是使用自签名证书。 出于开发目的,我不想验证该链。

将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}

网址已被屏蔽。

5 个答案:

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