iOS AFN之https配置小结

写在前面

只是对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)
iOS AFN之https配置小结_第1张图片
打开上面给的12306链接,点击https旁边的三角感叹号,依次如图操作,则会出现下图
iOS AFN之https配置小结_第2张图片
按住箭头所指图片,拖拽到桌面,之后返回到桌面,会发现kyfw.12306.cn.cer文件
  • 导入到Xcode项目中
    add file添加到项目中,ok。(这样假如失败的话,可以尝试导入证书之前,先双击证书添加到钥匙串中,之后允许,最后再导出,再重新导入到项目中)

步骤二:xcode info.list文件相关配置

主要是设置ATS开关和白名单(因为是自签名的证书,必须要添加白名单,即自己服务器的域名,否则无法访问)。


iOS AFN之https配置小结_第3张图片

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+, 快捷键进入浏览器设置界面)
iOS AFN之https配置小结_第4张图片
点击显示高级设置
iOS AFN之https配置小结_第5张图片
依次找到网路,点击更改代理服务器设置
iOS AFN之https配置小结_第6张图片
把图中箭头所指向的勾选去掉,点击好,最后要应用成功

之后浏览器刷新一个页面,会发现Charles此时就会抓到内容了。

iOS AFN之https配置小结_第7张图片
成功抓取某个页面的数据
  • 在模拟器运行你的项目,发现contents都是乱码等,表示成功
iOS AFN之https配置小结_第8张图片
iOS AFN之https配置小结_第9张图片
  • 真机运行项目
    确保iOS设备跟mac在同一网段(用同一个wifi就ok);
    点击iOS设备网络详情,找到HTTP代理,选择手动,服务器填写你mac的IP,端口填8888,配置完成。
iOS AFN之https配置小结_第10张图片
就是红框里面的

额外知识点补充

  • 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指的就是白名单)
Paste_Image.png
  • 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号,改成了不确定,给开发者更多的缓冲时间,到目前为止自签名证书都是可以的)

你可能感兴趣的:(iOS AFN之https配置小结)