美文网首页iOS-Objective-C
AF iOS11 HTTPS双向验证后闪退问题

AF iOS11 HTTPS双向验证后闪退问题

作者: 追沐 | 来源:发表于2017-11-03 17:27 被阅读34次

    问题描述

    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不需要。这样就不会导致闪退问题了,兼容线上。

    相关文章

      网友评论

        本文标题:AF iOS11 HTTPS双向验证后闪退问题

        本文链接:https://www.haomeiwen.com/subject/rcutmxtx.html