Alamofire SSL 失败
Posted
技术标签:
【中文标题】Alamofire SSL 失败【英文标题】:Alamofire SSL failure 【发布时间】:2015-06-05 16:06:16 【问题描述】:我知道这种类型的问题已经被问过很多次,但似乎有答案,但我无法让它发挥作用。
在我的环境中,生产环境是我唯一拥有有效 SSL 证书的地方。在针对生产环境构建的 ios 应用程序中使用 Alamofire 效果很好。我不想针对生产进行开发/测试,我们现在无法为任何其他环境获得有效的 SSL 证书。
我从 Alamofire 开发人员那里找到了this SO 的答案,提出了解决此问题的方法,但它对我不起作用。当我针对非生产环境运行我的应用程序时,我看到的失败意味着它使用的是 NSURLConnection 而不是 NSURLSession,因为提议的解决方案似乎依赖于此。
NSURLConnection/CFURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813)
如果有人可以就此分享他们的解决方案(也许是要点?)会很高兴。
【问题讨论】:
【参考方案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 框架使用过的全新实例。
【讨论】:
以上是关于Alamofire SSL 失败的主要内容,如果未能解决你的问题,请参考以下文章
Alamofire 2 不允许 SSL 连接 Instagram API
针对多个 CA 的 Alamofire 5 自定义 SSL 验证