kCFErrorDomainCFNetwork代码= 310"(null)"

时间:2016-12-09 00:02:00

标签: ios swift wkwebview

使用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环境。如果证书好或坏,我不在乎。如果我可以避免这种环境的任何安全要求,那就好了,但似乎任意负载设置对我没有任何作用。

我错过了什么?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

解决方案:

我们必须在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]];

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