使用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环境。如果证书好或坏,我不在乎。如果我可以避免这种环境的任何安全要求,那就好了,但似乎任意负载设置对我没有任何作用。
我错过了什么?
答案 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]];
请在上面对源代码进行更改。它将解决您的问题。