创建一个NSObject类把下面代码放入。在.h文件中公开方法。导入AFNetworking.h头文件

注意:该方法依赖AFNetworking3.0以上。请自行导入

+ (AFHTTPSessionManager *)xh_createAFHTTPSessionManagerWithBaseURLString:(NSString *)urlString{

#warning 注意:当导入工程时请在这里修改证书名字。并在工程中导入证书。如果证书类型不是cer则自行修改

    NSString * cerPath = [[NSBundle mainBundle] pathForResource:@"这里放证书名" ofType:@"cer"];

    NSData * certData =[NSData dataWithContentsOfFile:cerPath];

    NSSet * certSet = [[NSSet alloc]initWithObjects:certData, nil];

    /** 这里创建安全策略 */    

    AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];

    // 是否允许, YES为允许自签证书

    securityPolicy.allowInvalidCertificates = YES;

    // 是否验证域名

    securityPolicy.validatesDomainName = NO;

    // 设置证书

    securityPolicy.pinnedCertificates = certSet;

    //创建控制器 并做部分配置

    //创建manager时请指定一个BaseURL

    AFHTTPSessionManager *manager = [[AFHTTPSessionManager manager] initWithBaseURL:[NSURL URLWithString:urlString]];

    //导入安全策略

    manager.securityPolicy = securityPolicy;

   //设置默认解析类型,getresponseSerializerpostrequestSerializer ,如果不设置对应的serializer调用时将会报错

    manager.responseSerializer = [AFHTTPResponseSerializer serializer];

    manager.requestSerializer = [AFJSONRequestSerializer serializer];

    // 超时响应时间设置

    manager.requestSerializer.timeoutInterval = 10;

    return manager;

}

 

然后在你需要加载https的地方调用上面方法。

例: 我把上面方法放在了XHNetworking类中。

        NSString * urlStr = @"https://www.xxxxx.com"

        AFHTTPSessionManager * manager = [XHNetworking xh_createAFHTTPSessionManagerWithBaseURLString:urlStr];

  然后正常调用AF的get 或 post方法就行。

 

使用过程中我碰到几个问题。

1.在创建manager时没有设定BaseURL则会报错。

reason: 'A security policy configured with `AFSSLPinningModeCertificate` can only be applied on a manager with a secure base URL (i.e. https)'

碰到以上问题,在创建manager时指定BaseURL即可,如下:

AFHTTPSessionManager *manager = [[AFHTTPSessionManager managerinitWithBaseURL:[NSURL URLWithString:urlString]];

2.证书配置错误。如使用了一个过期或是错误的证书

运行时报错   Error Domain=NSURLErrorDomain Code=-999

同时还回返回"canceled"字样,表示任务已经放弃。

 3.Serializer未配置get要配置responseSerializerpost要配置requestSerializer,可以同时配置两个,但如果没有配置则会在调用时出错。

manager.responseSerializer = [AFHTTPResponseSerializer serializer];

manager.requestSerializer = [AFJSONRequestSerializer serializer];