AFNetworking 2.0 - 意外的 NSURLErrorDomain 错误 -1012

Posted

技术标签:

【中文标题】AFNetworking 2.0 - 意外的 NSURLErrorDomain 错误 -1012【英文标题】:AFNetworking 2.0 - unexpected NSURLErrorDomain error -1012 【发布时间】:2014-03-11 18:06:20 【问题描述】:

我们在使用 AFNetworking 2.0 的应用中遇到了以下问题。 当使用AFHTTPRequestOperationManager 的GET 方法时,我们得到一个错误NSURLErrorDomain code -1012。请求使用 HTTPS,服务器不需要用户认证。顺便说一句,请求从未到达服务器。

我们已经运行了几次测试,这是第一次产生错误,我们想知道这个错误是如何产生的,因为它似乎不相关。

AFHTTPRequestOperationManager 的设置:

httpOperationManager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL: 
        [NSURL URLWithString: HTTPS_URL)]];

httpOperationManager.responseSerializer = 
        [AFXMLParserResponseSerializer serializer];

[[AFNetworkActivityIndicatorManager sharedManager] setEnabled: YES];

获取请求

AFHTTPRequestOperation *op =[httpOperationManager GET: 
        [NSString stringWithFormat:SOME_PATH] 
        parameters:nil 
        success:^(AFHTTPRequestOperation *operation, id responseObject)  
            //code to setup NSXMLParser ...
         
        failure: ^(AFHTTPRequestOperation *operation, NSError *error) 
            NSLog(@"error %@", [error localizedDescription]);
        ];

【问题讨论】:

那么,问题是什么? 我的问题是导致 -1012 错误的原因,因为服务器不需要用户身份验证,我们的代码只是执行请求而不取消它。如果是 AFNetworking 取消了请求,我们想了解为什么以及如何处理它。 【参考方案1】:

我认为您已经解决了问题,但是如果您尝试在没有有效证书的服务器中进行身份验证,则必须在您的 AFHTTPRequestOperationManager 对象中为属性 allowInvalidCertificates 设置 YES

[yourManager.requestSerializer setAuthorizationHeaderFieldWithUsername:@"your_username" password:@"your_password"];
[yourManager.securityPolicy setAllowInvalidCertificates:YES];

另外,正如@a1phanumeric 所说,可能有必要包含这一行:

[yourManager.securityPolicy setValidatesDomainName:NO];

干杯。

【讨论】:

谢谢。是的,我们确实通过添加中间证书解决了服务器端问题。这样做比允许无效证书更安全。 任何使用来自startssl.com 的免费证书的人都会遇到这个问题。代码 -999。 对此的更新 - 我还必须添加 [operationManager.securityPolicy setValidatesDomainName:NO]; 才能使其正常工作。 非常感谢validatesDomainName 的加入。我们在这里玩的是纯 IP 地址,它非常需要这个地址才能工作。 @Charis 如何添加中间证书。你说的是 ssl 吗?【参考方案2】:

NSURLErrorDomain -1012 是NSURLErrorUserCancelledAuthentication。 (请参阅error code list 并搜索 -1012。)

您声明“服务器不需要用户身份验证”。但如果这是真的,则不会调用此错误。

可能的原因:

    您的服务器错误地请求授权(服务器错误) 由HTTPS_URLSOME_PATH 组成的URL 不是您所期望的,并且某些其他 服务器正在请求授权 某些中介(如代理服务器或接入点)需要授权。

一些调试技巧:

在 AFNetworking 实现中设置断点以查看哪个 URL 被命中 配置AFHTTPRequestOperationLogger,以便您可以在控制台日志中看到实际的请求正文和响应 使用curl 或Advanced Rest Client 发出相同的请求并观察服务器的响应

旁注:我认为[NSString stringWithFormat:SOME_PATH] 毫无意义——为什么不直接使用SOME_PATH

【讨论】:

这不是服务器/代理问题,因为我们在收到错误时进行了 tcp 转储,并且请求从未到达服务器。在客户端调用了“关闭通知”。我们只在特定设备上遇到过这个问题,我们不能重现(至少不容易)。我们重新启动了设备,但同样的请求仍然出现错误,然后我们卸载并重新安装了应用程序,错误消失了。我们担心可能导致它的原因,因为它没有重新出现在该设备或任何其他设备中。谢谢。 (SOME_PATH 实际上是对测试/生产 url 的检查) 我今天又遇到了同样的错误。顺便说一句,该设备在 WiFi 上。当我再次切换到 3G 时,请求未执行,但没有错误,因此不调用失败块。我只在设备的控制台中看到这些行“: __hid_dispatch_pthread_root_queue_create_block_invoke: specific=0x1780b5a80 pthread_self=0x10631c000”。 另一条信息是,我们在装有 ios 7.1 的设备上遇到了这些错误。从 Safari 请求相同的 https URL 会显示一个无法验证服务器身份的弹出窗口。按继续并不会实际执行请求。 经过几个小时的调查后发现,我们已经在服务器上安装了一个中间证书,因为缺少它,导致证书验证失败并出现 kSecTrustResultRecoverableTrustFailure 错误。在 iOS 7 上,这会导致与服务器的连接出现关闭通知,该通知以 NSURLErrorDomain 代码 -1012 的形式传递。按照CA机构的指示安装中间证书后,不再产生错误。

以上是关于AFNetworking 2.0 - 意外的 NSURLErrorDomain 错误 -1012的主要内容,如果未能解决你的问题,请参考以下文章

使用 AFNetworking 的 enqueueBatchOfHTTPRequestOperations 失败时如何重新添加操作

具有 setReachabilityStatusChangeBlock 支持的 AFNetworking EnqueueBatchOfHTTPRequestOperations

从 AFNetworking 1.3 迁移到 AFNetworking 2.0 的问题

AFNetworking 2.0 对现有项目的更新

AFNetworking 2.0 JSON 解析

如何在旧的 AFNetworking 中使用 AFNetworking 2.0+?