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

时间:2017-09-27 18:16:13

标签: ios swift afnetworking app-transport-security

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

  

任务< 2EC9C49F-1889-4BFF-83B4-2047ED6E5F2A>。< 1>。 HTTP加载失败(错误代码:-999 [1:89])   错误(countries.php):错误域= NSURLErrorDomain代码= -999“已取消”UserInfo = {NSErrorFailingURLStringKey = https://www.plrc.us/api/countries.php,NSLocalizedDescription =已取消,NSErrorFailingURLKey = https://www.plrc.us/api/countries.php}

我已经尽力了。

info.plist

请帮我解决这个问题。

谢谢

2 个答案:

答案 0 :(得分:4)

有一些小的,无关的问题:

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

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

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

  3. 但这些都不可能是NSURLErrorCancelled的来源。我能够从iOS查询此Web服务而不会出现此“已取消”错误(包括您的plist设置,并且根本没有任何plist网络相关设置)。

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

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

    例如,我能够在使用Charles时重现您的问题,并禁用Charles Root证书,从而导致这种无法启发的“已取消”错误。在我的特定示例中,一旦我配置我的模拟器以信任Charles的SSL,通过Charles的“帮助”»“SSL代理”»“为iOS模拟器安装Charles Root证书”)。我并不是说这是您案例中的确切问题(这对Charles的用户来说是独一无二的),但它是可能触发身份验证挑战的更广泛类别问题的一个示例,导致AFNetworking取消挑战,屈服NSURLErrorCancelled

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

答案 1 :(得分: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中发布了答案。

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