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

9
我正在iOS 11上使用AFNetworking。我遇到了以下错误:

Task <2EC9C49F-1889-4BFF-83B4-2047ED6E5F2A>.<1> HTTP加载失败(错误代码:-999 [1:89]) 错误(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}

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

info.plist

请帮我解决这个问题。
谢谢。

1
是的Rob,我知道Alamofire,但AFNetworking已经在这个项目中实现了,所以我没有改变它。 - Riddhi Shah
你特别提到了iOS 11。这个错误在iOS 10及之前的版本中没有发生吗?你确定你正在保留管理器,因为这可能会导致网络请求被取消吗?https://dev59.com/3lwX5IYBdhLWcg3w-Tlv#33154509 - wottle
@wottle - 这绝对是一个在Alamofire的边缘情况下可能会出现的问题,它在deinit中调用了invalidateAndCancel。但是AFNetworking不会这样做(当然,除非您子类化了AFURLSessionManagerAFHTTPSessionManager并在您的子类的dealloc中自己调用了它的invalidateSessionCancelingTasks)。 - Rob
2个回答

5
有一些小问题,与此无关:
  1. NSExceptionAllowsInsecureHTTPLoads 应该是布尔值,而不是字符串。

  2. 网络服务返回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 根证书时,我能够复制您的问题,从而产生这种无趣的“取消”错误。在我的特定示例中,一旦我通过 Charles 的“帮助”»“SSL 代理”»“为 iOS 模拟器安装 Charles 根证书”,配置我的模拟器信任 Charles 的 SSL。我并不是说这是您情况下确切的问题(这是 Charles 用户的独特问题),但它是可能触发身份验证挑战的更广泛类别问题的一个例子,导致 AFNetworking 取消挑战,产生 NSURLErrorCancelled

总之,请尝试更改连接到远程服务器的配置,并查看是否可以识别出不表现出问题和其他表现出问题的配置。


好的,我会在我的物理设备上检查。 - Riddhi Shah
另外,检查一下iOS设备上的日期/时间。有时它会导致证书验证出现问题。但我同意Rob的观点-这不是ATS的问题。其他事情正在发生。 - wottle
唯一应该导致“取消”错误的原因是您取消了任务,或者在底层的NSURLSession上调用了invalidateAndCancel。任何代理、证书或其他问题都应该产生与“取消”不同的结果。 - Lily Ballard
1
使用URLSession时,我会得到NSURLErrorServerCertificateUntrusted错误。只有当我编写urlSession(_:didReceive challenge:completionHandler:)并将.cancelAuthenticationChallenge传递给完成处理程序时,才能获得NSURLErrorCancelled错误。实际上,我在AFNetworking中添加了断点,并看到它的默认身份验证挑战处理程序正在执行这个操作,使用Objective-C版本的完成处理程序NSURLSessionAuthChallengeCancelAuthenticationChallenge - Rob
在我的情况下,当我开发iOS应用程序时,我有一个本地服务器。服务器和测试物理设备位于不同的WiFi连接中。当我将手机WiFi更改为服务器WiFi时,一切都正常工作。 - SajithK
显示剩余2条评论

3

我在开发一个概念验证时遇到了这个问题,而我们的服务器没有正确的证书。似乎大多数相关问题都是关于使用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的答案在这里找到的。

那个问题的OP用Swift发布了答案。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接