用的是afnetworking2.0的网络框架
我是将post请求和get请求自己封装了一下,这样就算升级afnetworking时,里面的方法变了,我们只需要更改自己封装的类就行了。
好了,首先我们需要服务器给我们一个crt的证书,然后打开,用钥匙串到处cer类型的文件,放到我们的项目中,然后在每一个请求中加上一段代码就行了。
+(void)POST:(NSString *)url parameters:(NSDictionary *)parameters success:(void (^)(id))success failure:(void (^)(NSError *))failure
{
AFHTTPRequestOperationManager*mager=[AFHTTPRequestOperationManager manager];
mager.responseSerializer = [AFJSONResponseSerializer serializer];
mager.requestSerializer=[AFJSONRequestSerializer serializer];
[mager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
//mager.securityPolicy.SSLPinningMode = AFSSLPinningModeCertificate;
// 设置证书模式
NSString * cerPath = [[NSBundle mainBundle] pathForResource:@"证书名字" ofType:@"cer"];
NSData * cerData = [NSData dataWithContentsOfFile:cerPath];
mager.securityPolicy.pinnedCertificates = [[NSArray alloc] initWithObjects:cerData, nil];
// 客户端是否信任非法证书
mager.securityPolicy.allowInvalidCertificates = YES;
// 是否在证书域字段中验证域名
[mager.securityPolicy setValidatesDomainName:NO];
[mager POST:url parameters:parameters success:^(AFHTTPRequestOperation * operation, id responseObject) {
if (success) {
if([[responseObject objectForKey:@"code"]integerValue]==3){
[MBProgressHUD hideHUD];
[self tokenchange:[responseObject objectForKey:@"message"]];
}
// else if([[responseObject objectForKey:@"code"]integerValue]==0){
// [MBProgressHUD showError:[responseObject objectForKey:@"message"]];
// }
else{
success(responseObject);
}
}
} failure:^(AFHTTPRequestOperation * operation, NSError * error) {
if (failure) {
failure(error);
}
}];
}
web页面时也需要使用https,这时我们只需要在appdelegeta中end后面添加一个方法就行了
@implementation NSURLRequest(DataController)
//ios 允许webview加载https网址
+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)host
{
return YES;
}
@end