【问题标题】:AFNetworking 2.0 - unexpected NSURLErrorDomain error -1012AFNetworking 2.0 - 意外的 NSURLErrorDomain 错误 -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 取消了请求,我们想了解为什么以及如何处理它。

标签: afnetworking nsurlerrordomain


【解决方案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。)

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

可能的原因:

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

一些调试技巧:

  • 在 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机构的指示安装中间证书后,不再产生错误。
猜你喜欢
  • 1970-01-01
  • 2015-03-04
  • 2016-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-12
  • 1970-01-01
相关资源
最近更新 更多