【发布时间】: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];
}
更新: 作为对 cmets 的回应:这是管理器的声明方式:
@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。
-
请添加您如何声明经理的代码?以及创建管理器的代码被调用了多少次
-
@marcusficner 如果是,那不是我自己的代码在做;因为我还没有编写代码来取消请求。无论如何都会检查链接 - 谢谢。
标签: ios objective-c afnetworking ios11