【问题标题】:kCFErrorDomainCFNetwork Code=310 "(null)"kCFErrorDomainCFNetwork 代码=310 "(null)"
【发布时间】: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 我添加了一个答案。这是我们目前最好的解决方案。

标签: ios swift wkwebview


【解决方案1】:

当前的解决方案是关闭 TLS 1.0。如果有人提出更好的答案,请更新。听起来 Apple 没有解决此问题的内置方法。

【讨论】:

    【解决方案2】:

    解决方案:

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

    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]];
    

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

    【讨论】:

    • 谢谢。 Web 视图的代理配置问题是我遇到问题的关键。
    猜你喜欢
    • 2016-06-26
    • 2014-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-28
    • 1970-01-01
    相关资源
    最近更新 更多