【问题标题】:AFNetworking - HTTP load failed (error code: -999) swift iOSAFNetworking - HTTP 加载失败(错误代码:-999)swift iOS
【发布时间】:2018-03-09 08:10:26
【问题描述】:

我在 iOS 11 中使用 AFNetworking。我收到如下错误:

任务 . HTTP 加载失败(错误代码:-999 [1:89]) 错误(countries.php):错误域=NSURLErrorDomain 代码=-999 “取消” UserInfo={NSErrorFailingURLStringKey=https://www.plrc.us/api/countries.php, NSLocalizedDescription=cancelled, NSErrorFailingURLKey=https://www.plrc.us/api/countries.php}

我已经尝试了所有可能的方法。

请帮我解决这个问题。

谢谢

【问题讨论】:

  • 是的Rob,我知道Alamofire,但是AFNetworking已经在这个项目中实现了,儿子我没改
  • 你特意调出iOS 11。iOS 10及之前的版本不会出现这个错误吗?您确定保留经理,这可能会导致网络请求被取消? stackoverflow.com/a/33154509/3708242
  • @wottle - 这绝对是一个问题,它可以在 Alamofire 的边缘情况下表现出来,它在 deinit 中调用 invalidateAndCancel。但是 AFNetworking 并没有这样做(当然,除非您将 AFURLSessionManagerAFHTTPSessionManager 子类化并在您的子类的 dealloc 中自己调用它的 invalidateSessionCancelingTasks)。

标签: ios swift afnetworking app-transport-security


【解决方案1】:

有一些无关紧要的小问题:

  1. NSExceptionAllowsInsecureHTTPLoads 应该是布尔值,而不是字符串。

  2. Web 服务返回 JSON,但将其 Content-Type 保留为 text/html。但是 AFNetworking(及其 Swifty 兄弟 Alamofire)验证 Content-Type HTTP 标头。

    如果使用 AFNetworking,这意味着您可能希望将text/html 添加到AFJSONResponseSerializer 的可接受内容类型列表中。 (或者你可以使用AFHTTPResponseSerializer,但是你必须自己解析JSON。)

但这些都不是NSURLErrorCancelled 的来源。我能够从 iOS 查询此 Web 服务而不会收到此“已取消”错误(无论是您的 plist 设置,还是根本没有任何 plist 网络相关设置)。

我想知道您的计算机或网络是否存在配置问题。我会尝试在物理设备而不是模拟器上进行测试。 (这消除了可能是问题根源的计算机配置。)如果可行,我会尝试在蜂窝连接而不是通过 wifi 上进行测试。 (这消除了您的 LAN 的配置,例如一些代理服务器的怪异,作为问题的根源。)

在 AFNetworking 中,默认的身份验证质询例程将 NSURLSessionAuthChallengeCancelAuthenticationChallenge 传递给 URLSession:didReceiveChallenge:completionHandler: 的完成处理程序,这将导致 NSURLErrorCancelled。但标准系统配置不会触发此操作。但是,如果您的计算机或网络有什么东西会在AFURLSessionManager 中触发此身份验证挑战。

例如,当我使用Charles 并禁用查尔斯根证书时,我能够重现您的问题,从而导致这种不明智的“取消”错误。在我的特定示例中,一旦我将模拟器配置为信任 Charles 进行 SSL,通过 Charles 的“帮助”»“SSL 代理”»“为 iOS 模拟器安装 Charles 根证书”)。我并不是说这是您案例中的确切问题(这是 Charles 用户独有的),但它是可能触发身份验证挑战的更广泛问题类别的一个示例,导致 AFNetworking 取消挑战,产生NSURLErrorCancelled.

最重要的是,尝试改变您尝试连接到远程服务器的配置,看看您是否可以识别出不存在问题的配置以及其他存在问题的配置。

【讨论】:

  • 好的,我会检查我的物理设备。
  • 另外,检查 iOS 设备上的日期/时间。有时它可能会导致证书验证出现问题。但我同意 Rob - 这不是 ATS 问题。其他事情正在发生
  • 唯一应该导致“取消”错误的事情是您取消了任务,或者您在底层NSURLSession 上调用了invalidateAndCancel。任何与代理、证书或其他任何问题有关的问题都应该产生“已取消”以外的其他内容。
  • AFNetworking 是否在做一些愚蠢的事情,比如在证书验证期间取消任务?你能直接使用 NSURLSession 重现令人惊讶的“取消”错误吗?
  • URLSession 我得到NSURLErrorServerCertificateUntrusted。如果我写一个urlSession(_:didReceive challenge:completionHandler:) 并将.cancelAuthenticationChallenge 传递给完成处理程序,我只能得到NSURLErrorCancelled。事实上,我在 AFNetworking 中添加了断点,并且看到这正是它的默认身份验证挑战处理程序正在做的事情,使用 Objective-C 版本调用完成处理程序,NSURLSessionAuthChallengeCancelAuthenticationChallenge
【解决方案2】:

我在开发概念证明时遇到了这个问题,我们的服务器没有正确的证书。似乎与此相关的大多数问题都与使用 AFNetworking 1 和 2 相关,而大多数答案对我来说不适用于 AFNetworking 3,包括修改 .plist

对我有用的是像这样修改AFSecurityPolicy *securityPolicy;

AFSecurityPolicy *sec = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
[sec setAllowInvalidCertificates:YES];
[sec setValidatesDomainName:NO];
manager.securityPolicy = sec;

感谢Dody Rachmat Wicaksono's 回答here.,我找到了这个

该问题的 OP 在 Swift 中发布了答案。

注意:与其他类似的解决方法一样,这并不意味着在生产环境中使用。

【讨论】:

    猜你喜欢
    • 2018-07-16
    • 2017-11-07
    • 1970-01-01
    • 1970-01-01
    • 2016-01-13
    • 2018-11-04
    • 2019-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多