【问题标题】:AFNetworking iOS11 - HTTP load failed -999AFNetworking iOS11 - HTTP 加载失败 -999
【发布时间】:2018-07-16 15:30:20
【问题描述】:

我有一个生产中的应用程序已经运行了一段时间。但是,由于 iOS 11 - 我收到此错误:

任务 . HTTP 加载失败(错误代码:-999 [1:89]) 任务 . 以错误结束 - 代码:-999

这仅在 iOS 11 上发生。此外,它并不一致。在对同一 URL 的五个请求中,有两个会因此失败。在蜂窝连接上,它发生的频率较低,但它仍然存在。

如前所述,我正在使用 AFNetworking;在 iOS11 之前,这从来都不是问题。

有什么想法吗?

更新以添加更多详细信息:

我正在使用带有有效证书的 SSL Pinning。我的 info.plist 看起来像这样:

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSExceptionDomains</key>
        <dict>
            <key>url.com</key>
            <dict>
                <key>NSExceptionAllowsInsecureHTTPLoads</key>
                <true/>
                <key>NSExceptionRequiresForwardSecrecy</key>
                <false/>
                <key>NSIncludesSubdomains</key>
                <true/>
            </dict>
        </dict>
    </dict>

像这样使用 SSL 固定:

    NSString *pathToProdCert = [[NSBundle mainBundle]pathForResource:@"MY_CERT" ofType:@"cer"];

if(pathToProdCert){
       manager.securityPolicy.pinnedCertificates = [NSSet setWithObjects[NSData dataWithContentsOfFile:pathToProdCert], nil];
            manager.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModePublicKey];
        }

更新: 作为对 cme​​ts 的回应:这是管理器的声明方式:

@property (nonatomic) AFHTTPSessionManager *manager;

管理器是通过我的 web 服务类的 init 方法初始化的:

-(instancetype)initWithBaseUrl:(NSURL *)url {

    self  = [super init];
    if (self){
        self.manager = [[AFHTTPSessionManager alloc] initWithBaseURL:url];
        self.manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    }

    return self;
}

每个应用会话仅初始化一次。

更新: 根据要求,这是返回的error 中的userInfo

NSErrorFailingURLKey = "https://MY_URL/PARAMS"; NSErrorFailingURLStringKey = "https://MY_URL/PARAMS"; NSLocalizedDescription = 取消; NSUnderlyingError = "错误域=kCFErrorDomainCFNetwork Code=-999 \"(null)\" UserInfo={_kCFStreamErrorCodeKey=89, _kCFStreamErrorDomainKey=1}"; "_kCFStreamErrorCodeKey" = 89; "_kCFStreamErrorDomainKey" = 1;

经过更多测试,我注意到如果我重新创建网络类,在每个网络调用中声明 manager,我永远不会收到此错误。

【问题讨论】:

  • 你是否在 info.plist 中设置了 NSAppTransportSecurity 设置?
  • @gotomanners - 对不起,我忘了提。我做到了,将 NSAllowsArbitraryLoads 设置为 true。
  • 请添加您如何声明经理的代码?以及创建管理器的代码被调用了多少次
  • 请求是否被取消了?见:developer.apple.com/documentation/foundation/…
  • @marcusficner 如果是,那不是我自己的代码在做;因为我还没有编写代码来取消请求。无论如何都会检查链接 - 谢谢。

标签: ios objective-c afnetworking ios11


【解决方案1】:

-999ErrorCancelled

初始化的管理器是不拥有的,并且在它超出范围后不久就会被释放。因此,所有待处理的任务都会被取消。

使用 AFHTTPSessionManager 创建一个单例类并将其用于所有请求。

YourAPIClient.h

#import "AFHTTPSessionManager.h"
@interface YourAPIClient : AFHTTPSessionManager
+(YourAPIClient *) sharedClient;
@end

YourAPIClient.m

#import "YourAPIClient.h"

@implementation YourAPIClient

//Singleton Shared Client
+(YourAPIClient *)sharedClient
{
    static YourAPIClient *_sharedClient = nil;
    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{
        NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];

        // Initialize Session Manager
       _sharedClient = [[YourAPIClient alloc] initWithSessionConfiguration:sessionConfiguration];
        // Configure Manager
        [_sharedClient setResponseSerializer:[AFHTTPResponseSerializer serializer]];

    });

    return _sharedClient;
}

【讨论】:

  • 这是我得到的,也是我探索的东西。我不明白的是,为什么这只是 iOS11 + 设备上的问题,而不是早期版本的 iOS?
【解决方案2】:

我们有一个类似的案例。 对于我们的特殊情况,客户在公司网络中使用该应用程序,该网络将公司的证书注入到每个请求中。如果设备没有公司的自定义 CA,则用户会收到此特定错误。

【讨论】:

  • 这不是我遇到的问题。如前所述,即使在蜂窝网络上,我们也会遇到此问题。这排除了公司证书问题。感谢您的意见。
【解决方案3】:

这似乎是 iOS 中的一个错误。与HTTP load failed(CFErrorDomainCFNetwork)、999 关联的错误代码用于取消请求 (cfurlErrorCancelled)。

你自己回答了这个问题。要使其在 iOS 11 上正常工作,您应该考虑为每个呼叫使用不同的管理器,因为一个管理器上的网络请求似乎相互冲突。

参考资料:

https://github.com/AFNetworking/AFNetworking/issues/3999 https://developer.apple.com/documentation/cfnetwork/cfnetworkerrors/1416998-cfurlerrorcancelled NSURLErrorDomain error code -999 in iOS

【讨论】:

    猜你喜欢
    • 2018-03-09
    • 1970-01-01
    • 2017-11-07
    • 1970-01-01
    • 2018-11-04
    • 2015-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多