创建一个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;
//设置默认解析类型,get用responseSerializer,post用requestSerializer ,如果不设置对应的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 manager] initWithBaseURL:[NSURL URLWithString:urlString]];
2.证书配置错误。如使用了一个过期或是错误的证书
运行时报错 Error Domain=NSURLErrorDomain Code=-999
同时还回返回"canceled"字样,表示任务已经放弃。
3.Serializer未配置,get要配置responseSerializer,post要配置requestSerializer,可以同时配置两个,但如果没有配置则会在调用时出错。
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
manager.requestSerializer = [AFJSONRequestSerializer serializer];