iOS AFN之https配置小结,iosafnhttps小结


转载自:https://www.jianshu.com/p/b254abbe3e13

写在前面

只是对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+, 快捷键进入浏览器设置界面)

















额外知识点补充

  • 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是可以正常加载的。











查看评论

相关内容