【问题标题】:Alamofire SSL failureAlamofire SSL 失败
【发布时间】:2015-06-05 16:06:16
【问题描述】:

我知道这种类型的问题已经被问过很多次,但似乎有答案,但我无法让它发挥作用。

在我的环境中,生产环境是我唯一拥有有效 SSL 证书的地方。在针对生产环境构建的 iOS 应用程序中使用 Alamofire 效果很好。我不想针对生产进行开发/测试,我们现在无法为任何其他环境获得有效的 SSL 证书。

我从 Alamofire 开发人员那里找到了this SO 的答案,提出了解决此问题的方法,但它对我不起作用。当我针对非生产环境运行我的应用程序时,我看到的失败意味着它使用的是 NSURLConnection 而不是 NSURLSession,因为提议的解决方案似乎依赖于此。

NSURLConnection/CFURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813)

如果有人可以就此分享他们的解决方案(也许是要点?)会很高兴。

【问题讨论】:

    标签: swift ssl alamofire


    【解决方案1】:

    我终于明白了。我引用的 SO 答案中有一个小但重要的错误。我提交了一个编辑,但将在此处发布工作代码:

    let manager = Alamofire.Manager.sharedInstance
    
    manager.delegate.sessionDidReceiveChallenge = { session, challenge in
        var disposition: NSURLSessionAuthChallengeDisposition = .PerformDefaultHandling
        var credential: NSURLCredential?
    
        if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust {
            disposition = NSURLSessionAuthChallengeDisposition.UseCredential
            credential = NSURLCredential(forTrust: challenge.protectionSpace.serverTrust)
        } else {
            if challenge.previousFailureCount > 0 {
                disposition = .CancelAuthenticationChallenge
            } else {
                credential = manager.session.configuration.URLCredentialStorage?.defaultCredentialForProtectionSpace(challenge.protectionSpace)
    
                if credential != nil {
                    disposition = .UseCredential
                }
            }
        }
    
        return (disposition, credential)
    }
    

    问题在于它没有使用Alamofire.Manager 的单例实例。相反,它创建了一个从未被 Alamofire 框架使用过的全新实例。

    【讨论】:

      猜你喜欢
      • 2018-09-04
      • 2018-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-22
      • 2020-06-20
      • 1970-01-01
      相关资源
      最近更新 更多