kCFErrorDomainCFNetwork Code = 310“(null)”

使用WKWebView连接到一个站点,该站点在用户选择后将重定向到另一个站点。 didReceiveServerRedirectForProvisionNavigation之后出现以下错误:

 Error Domain=kCFErrorDomainCFNetwork Code=310 "(null)" UserInfo={_WKRecoveryAttempterErrorKey=, _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环境。 我不在乎证书是好还是坏。 如果我可以避免对这个环境的任何安全要求那么好,但似乎任意负载设置对我没有任何作用。

我错过了什么?

目前的解决方案是关闭TLS 1.0。 如果有人想出更好的答案,请更新。 听起来苹果没有内置的方法来解决这个问题。

解:

我们必须在NSURLSession请求中启用Proxy,如下所示:

 NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; configuration.timeoutIntervalForRequest = 60; /* To Fixed AIRWatch SDK Issue in API Calling */ // Create an NSURLSessionConfiguration that uses the proxy NSDictionary *proxyDict = @{ @"HTTPEnable" : [NSNumber numberWithInt:1], @"HTTPSEnable" : [NSNumber numberWithInt:1], }; configuration.connectionProxyDictionary = proxyDict; NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:[NSOperationQueue mainQueue]]; 

请在上面的源代码中进行更改。 它将解决您的问题。