【发布时间】:2016-12-09 00:01:59
【问题描述】:
使用 WKWebView 连接到一个站点,该站点在用户选择后将重定向到另一个站点。在didReceiveServerRedirectForProvisionNavigation之后出现如下错误:
Error Domain=kCFErrorDomainCFNetwork Code=310 "(null)" UserInfo={_WKRecoveryAttempterErrorKey=<WKReloadFrameErrorRecoveryAttempter: 0x60800002a8e0>, _kCFStreamErrorCodeKey=-2096, _kCFStreamErrorDomainKey=4}
这里并没有什么特别的事情发生。我只是想模仿 Safari。
我还用以下内容覆盖了didReceive challenge:
func webView(_ webView: WKWebView, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
var cred: URLCredential?
if let trust = challenge.protectionSpace.serverTrust {
cred = URLCredential(trust: trust)
} else {
//creds are hardcoded just to try to get the thing working.
cred = URLCredential(user: "hardcodedusername", password: "hardcodedpassword", persistence: .permanent)
}
completionHandler(.useCredential, cred)
}
值得注意的是,重定向时不会调用didReceive challenge。
我的假设是我尝试重定向到的站点具有旧的加密协议 (TLS 1.0),而 iOS 不允许重定向。该网站在 iPhone 上的 Safari 中运行良好。我还设置了 ATS 任意负载。这是 Objective-C 到 Swift 的转换,Objective-C 版本没有这个问题(使用 UIWebView,这是我在尝试 WKWebView 之前的原始实现......同样的错误)。
需要明确的是,这是一个 QA 环境。我不在乎证书是好是坏。如果我可以避免对这个环境的任何安全要求,那就太好了,但似乎任意加载设置对我没有任何作用。
我错过了什么?
【问题讨论】:
-
任意加载都会让您获得 http,而不是损坏或旧的 https。查看此答案中的代码,看看您是否可以使用 NSURLConnection 访问该站点:stackoverflow.com/questions/14268230/…
-
感谢您的评论,但它似乎不起作用。我尝试过同时使用 NSURLConnection 和 URLSession (使用适当的代表)。问题是......挑战方法永远不会被击中。最后我得到了同样的错误。
-
尝试用openssl连接,比如
openssl s_client -connect host:443——如果它连接了,你可以输入一个HTTP请求,比如GET / HTTP/1.0——如果没有,它应该会出错。您还可以尝试控制 openssl 使用的 tls 版本(参见手册页) -
这可能与无效/受损的证书有关。在运行 charles 代理时通过模拟器发出上传请求时,我收到了相同的错误代码 (310)。
-
@EmrahAkgül 我添加了一个答案。这是我们目前最好的解决方案。