写在前面
只是对AFN https配置一个简单的总结,想深入研究的大咖,请绕行哦😝
- 为什么配置https?
苹果要求所有 iOS 应用在年底前默认使用 HTTPS 连接 - 该小结具体项目环境?
自签名证书(cer格式);
Xcode Version 8.1;
OS X EI Capitan 10.11.5;
Objective-C;
CocoaPods,AFN都是最新版本。
正题
AFN https认证主要的四个步骤:
步骤一:服务器cer证书导入Xcode项目
- 获得证书cer文件
法一,服务器那边给(我们项目服务器给的cer文件,导入项目中出了点问题,之后用的是自己在网站上导的);
法二,自己在网站导出(以下面12306网页为例 https://kyfw.12306.cn/otn/lcxxcx/init)
- 导入到Xcode项目中
add file添加到项目中,ok。(这样假如失败的话,可以尝试导入证书之前,先双击证书添加到钥匙串中,之后允许,最后再导出,再重新导入到项目中)
步骤二:xcode info.list文件相关配置
主要是设置ATS开关和白名单(因为是自签名的证书,必须要添加白名单,即自己服务器的域名,否则无法访问)。
notice:图中ATS下面的Allow Arbitrary Loads 若设置成YES的话,则app允许http访问,其实这样绕过了https,但是这种情况确实非常不安全,后面可以看到Charles一抓包,数据全都能看的见。
步骤三:AFN程序代码相关配置
AFHTTPSessionManager *session = [AFHTTPSessionManager manager];
//配置https
session.securityPolicy = [self customSecurityPolicy];
session.securityPolicy.allowInvalidCertificates = YES;
#pragma mark- 配置https
- (AFSecurityPolicy *)customSecurityPolicy
{
/** https */
NSString*cerPath = [[NSBundle mainBundle] pathForResource:@"kyfw.12306.cn.cer"ofType:nil];
NSData*cerData = [NSData dataWithContentsOfFile:cerPath];
NSSet*set = [[NSSet alloc] initWithObjects:cerData,nil];
AFSecurityPolicy *policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate withPinnedCertificates:set];
return policy;
}
步骤四:Charles抓包验证
- 首先检测,google浏览器请求,Charles抓包是否成功,若失败,解决方法如下(cmd+, 快捷键进入浏览器设置界面)
之后浏览器刷新一个页面,会发现Charles此时就会抓到内容了。
- 在模拟器运行你的项目,发现contents都是乱码等,表示成功
- 真机运行项目
确保iOS设备跟mac在同一网段(用同一个wifi就ok);
点击iOS设备网络详情,找到HTTP代理,选择手动,服务器填写你mac的IP,端口填8888,配置完成。
额外知识点补充
- AFN设置自定义User-Agent(具体应用场景相应修改)
AFHTTPSessionManager *session = [AFHTTPSessionManager manager];
//设置自定义代理参数
[session.requestSerializer setValue:[self setUserAgent] forHTTPHeaderField:@"User-Agent"];
#pragma -mark User-Agent添加参数
- (NSString *)setUserAgent{
UIWebView *webView = [[UIWebView alloc] init];
NSString *userAgent = [webView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];
NSString *version_current = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
NSMutableString *newAgent = [NSMutableString stringWithString:userAgent];
//查找Helloan_IOS_APP字符串
NSRange substr = [newAgent rangeOfString:@"Helloan_IOS_APP"];
if (substr.location != NSNotFound) {
//有这个字符串
}else{
//没有的话追加
[newAgent appendFormat:@"%@%@", @" Helloan_IOS_APP/",version_current];
}
NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:newAgent, @"UserAgent", nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];
return newAgent;
}```
* AFN 头像上传 客户端接收失败问题(接收格式设置)
AFHTTPSessionManager *session = [AFHTTPSessionManager manager];
session.responseSerializer = [AFJSONResponseSerializer serializer];
//acceptableContentTypes 配置很重要,否则上传失败
session.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"multipart/form-data",@"text/plain", nil];```
补充
- Allow Arbitrary Loads 这个设置成NO的情况下,域名假如是test.helloan.cn,此时没有被假如白名单。
测试中会发现,ios9 webview加载空白,而ios8.3是可以正常加载的。
- 如何添加白名单(Exception Domain指的就是白名单)
- sdwebimage请求图片https设置(options:SDWebImageAllowInvalidSSLCertificates)
[self.ivHeadPortrait sd_setImageWithURL:[NSURL URLWithString:urlStringHead]
placeholderImage:[UIImage imageNamed:@"portraitDefault"] options:SDWebImageAllowInvalidSSLCertificates];
- iOS webview/wkwebview不要求配置https,http请求也是行的
待确定问题
- 不知道自签名证书,苹果那边认不认,这个只能等17年1月1号 以后上传新版本知晓,到时再更新😀
(苹果对https要求又放开了,由之前的1月1号,改成了不确定,给开发者更多的缓冲时间,到目前为止自签名证书都是可以的)