问题描述
iOS11 HTTPS做双向验证后,使用AF时闪退。不加全局断点的话奔溃到iOS11的系统库里面:
iOS11.png加全局断点的话闪退到AF里:
AF.png原因
-
如果是HTTP类型的URL,还走验证的话会闪退
-
如果是HTTPS类型的URL,初始化AFHTTPSessionManager的时候用init方法会闪退。
两种情况
1、如果是HTTP类型的URL,初始化AFHTTPSessionManager对象的时候
_httpSessionManager = [AFHTTPSessionManager manager];
_httpSessionManager.responseSerializer = [AFHTTPResponseSerializer serializer];
[_httpSessionManager.requestSerializer setValue:@"text/plain" forHTTPHeaderField:@"Content-Type"];
self.timeoutInterval = NETWORK_REQUST_TIME_OUT;
_httpSessionManager.requestSerializer.timeoutInterval = self.timeoutInterval;
这样的iOS11 HTTPS接口直接会闪退
2、如果做HTTPS验证
//需要在建立 AFHTTPSessionManager的同时设置baseUrl
_httpSessionManager = [[AFHTTPSessionManager manager] initWithBaseURL:[NSURL URLWithString:Connect_Host_Url]];
_httpSessionManager.responseSerializer = [AFHTTPResponseSerializer serializer];
[_httpSessionManager.requestSerializer setValue:@"text/plain" forHTTPHeaderField:@"Content-Type"];
self.timeoutInterval = NETWORK_REQUST_TIME_OUT;
_httpSessionManager.requestSerializer.timeoutInterval = self.timeoutInterval;
//https验证
[_httpSessionManager setSecurityPolicy:[DDRequestManager customSecurityPolicy]];
这样的话HTTPS不会有什么问题,但是HTTP接口就会直接闪退。初始化_httpSessionManager的时候用_httpSessionManager = [AFHTTPSessionManager manager]方法会导致HTTPS接口闪退。
解决
-
HTTP的接口创建AFHTTPSessionManager对象时,可以不用设置baseUrl,用_httpSessionManager = [AFHTTPSessionManager manager]也没问题,但是不能做验证。
-
如果是HTTPS的接口则必须指定baseUrl用 _httpSessionManager = [[AFHTTPSessionManager manager] initWithBaseURL:[NSURL URLWithString:Connect_Host_Url]]方法,而且需要做HTTPS验证。
如果需要两者兼容:
//需要在建立 AFHTTPSessionManager的同时设置baseUrl
_httpSessionManager = [[AFHTTPSessionManager manager] initWithBaseURL:[NSURL URLWithString:Connect_Host_Url]];
//指定可接收服务器的数据的类型
_httpSessionManager.responseSerializer = [AFHTTPResponseSerializer serializer];
//指定向服务器发送的数据的类型
[_httpSessionManager.requestSerializer setValue:@"text/plain" forHTTPHeaderField:@"Content-Type"];
self.timeoutInterval = NETWORK_REQUST_TIME_OUT;
if ([Connect_Host_Url containsString:@"https"]) {
[_httpSessionManager setSecurityPolicy:[DDRequestManager customSecurityPolicy]];
}
不管是HTTP还是HTTPS _httpSessionManager = [[AFHTTPSessionManager manager] initWithBaseURL:[NSURL URLWithString:Connect_Host_Url]]方法都是可以的,HTTPS需要做下验证,HTTP不需要。这样就不会导致闪退问题了,兼容线上。
网友评论