Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Alamofire:[结果]:失败:错误域=nsurErrorDomain代码=-999“;“已取消”;_Ios_Swift_Xcode_Alamofire - Fatal编程技术网

Ios Alamofire:[结果]:失败:错误域=nsurErrorDomain代码=-999“;“已取消”;

Ios Alamofire:[结果]:失败:错误域=nsurErrorDomain代码=-999“;“已取消”;,ios,swift,xcode,alamofire,Ios,Swift,Xcode,Alamofire,我连接到的服务正在使用自签名证书。 出于开发目的,我不想验证该链 使用swift 3和Alamofire 4。 相应地修正了自动测试系统: <key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>url.com</key> <dict>

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

使用swift 3和Alamofire 4。 相应地修正了自动测试系统:

<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>
来自转储打印的错误日志

[结果]:失败:错误域=nsurErrorDomain代码=-999“已取消” UserInfo={NSErrorFailingURLKey=,, NSLocalizedDescription=已取消, NSErrorFailingURLStringKey=}


URL已被屏蔽

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

manager.session.invalidateAndCancel()
如果管理器的对象在块执行完成之前不保留,则会发生这种情况,因此这将确保其保留


干杯

请登录
SessiondReceiveChallenge:
委托执行
NSURLSession
。很可能NSURLSessionAuthChallengeCancelAuthenticationChallenge正在某个地方执行

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

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

否则,
sessionManager
将很快被解除分配,它将超出范围,任何正在执行的请求都将被取消。

您需要正确管理
sessionManager
实例的生存期。最常见的方法是创建一个单例实例。否则,当您的经理超出范围并被拒绝时,所有未完成的请求都将被取消

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.finishtasks和invalidate()

sessionManager.request(“,headers:headers”).responseJSON{response in/*…*/if let JSON=response.result.value{print(“JSON:”JSON)”)}sessionManager.session.invalidateAndCancel()}很抱歉,我在尝试时搞砸了配置。这不是一个合适的解决方案,是一种反模式。您应该将manager实例设置为单实例,或者使用其他方式在本地使用之外对其进行持久化。@JonShier作为反模式的解决方案并不是那么广泛使用:)您可能会遇到这样的情况,即在应用程序的整个生命周期中不需要保留
SessionManager
,因此,在请求完成后取消分配是明智的。然后,生命周期应该适当地延长,也许可以将管理器存储在某个位置,并在适当的时候取消它。强制局部引用只是为了使某些内容保持活动状态始终是一种反模式,因为这意味着您没有正确处理变量的生命周期。@JonShier我同意您的看法。上述“变通方法”通常用于在方法返回后保留方法范围中定义的某些实例。我们可以在类范围中定义
var sessionManager:sessionManager?
变量,并在
responseJSON
中将其设置为
nil
。这是一个更干净的解决方案,但在内存管理和其他基础方面,它与“解决方案”有何不同?
self.getSessionManager().request(urlstring, method: methods, parameters: parameters, encoding: JSONEncoding.prettyPrinted, headers: Header).responseJSON(queue: nil, options: JSONSerialization.ReadingOptions.allowFragments) { (responseObject) in ... .... }.session.finishTasksAndInvalidate()