AFNetworking - HTTP 加载失败(错误代码:-999)swift iOS

AFNetworking - HTTP load failed (error code: -999) swift iOS

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

Task <2EC9C49F-1889-4BFF-83B4-2047ED6E5F2A>.<1> HTTP load failed (error code: -999 [1:89]) Error(countries.php): Error Domain=NSURLErrorDomain Code=-999 "cancelled" UserInfo={NSErrorFailingURLStringKey=https://www.plrc.us/api/countries.php, NSLocalizedDescription=cancelled, NSErrorFailingURLKey=https://www.plrc.us/api/countries.php}

所有可能的方法我都试过了

请帮我解决这个问题。

谢谢

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

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

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

    如果使用 AFNetworking,这意味着您可能想要将 text/html 添加到 AFJSONResponseSerializer 可接受的 content-types 列表中。 (或者你可以使用 AFHTTPResponseSerializer,但你必须自己解析 JSON。)

但这两个都不太可能是 NSURLErrorCancelled 的来源。我能够从 iOS 查询此 Web 服务而没有收到此“已取消”错误(既有您的 plist 设置,也没有任何 plist 网络相关设置)。

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

在 AFNetworking 中,默认身份验证质询例程将 NSURLSessionAuthChallengeCancelAuthenticationChallenge 传递给 URLSession:didReceiveChallenge:completionHandler: 的完成处理程序,这将导致 NSURLErrorCancelled。但是标准的系统配置不会触发这个。但是,如果您的计算机或网络有某些问题触发了 AFURLSessionManager 中的身份验证质询。

例如,在使用 Charles 并禁用 Charles Root 证书时,我能够重现您的问题,从而导致这种 un-enlightening“已取消”错误。在我的特定示例中,一旦我将模拟器配置为信任 Charles 的 SSL,通过 Charles 的“帮助”»“SSL 代理”»“为 iOS 模拟器安装 Charles 根证书”)。我并不是说这正是您遇到的问题(这对 Charles 用户来说是独一无二的),但它是一个更广泛的 class 问题示例,可能会触发身份验证挑战,导致 AFNetworking 取消挑战,产生 NSURLErrorCancelled.

最重要的是,尝试改变您尝试连接到远程服务器所使用的配置,看看您是否可以识别未出现问题的配置和其他出现问题的配置。

我 运行 在开发概念证明时遇到了这个问题,但我们的服务器没有正确的证书。似乎与此相关的大多数问题都是关于使用 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 answer

我找到了这个

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

注意: 与其他类似的解决方法一样,这不适用于生产环境。