寫(xiě)在前面
只是對(duì)AFN https配置一個(gè)簡(jiǎn)單的總結(jié)像棘,想深入研究的大咖义钉,請(qǐng)繞行哦??
- 為什么配置https层宫?
蘋(píng)果要求所有 iOS 應(yīng)用在年底前默認(rèn)使用 HTTPS 連接 - 該小結(jié)具體項(xiàng)目環(huán)境糖耸?
自簽名證書(shū)(cer格式)辕万;
Xcode Version 8.1;
OS X EI Capitan 10.11.5;
Objective-C;
CocoaPods,AFN都是最新版本彪见。
正題
AFN https認(rèn)證主要的四個(gè)步驟:
步驟一:服務(wù)器cer證書(shū)導(dǎo)入Xcode項(xiàng)目
- 獲得證書(shū)cer文件
法一儡司,服務(wù)器那邊給(我們項(xiàng)目服務(wù)器給的cer文件,導(dǎo)入項(xiàng)目中出了點(diǎn)問(wèn)題余指,之后用的是自己在網(wǎng)站上導(dǎo)的)捕犬;
法二,自己在網(wǎng)站導(dǎo)出(以下面12306網(wǎng)頁(yè)為例 https://kyfw.12306.cn/otn/lcxxcx/init)
打開(kāi)上面給的12306鏈接酵镜,點(diǎn)擊https旁邊的三角感嘆號(hào)碉碉,依次如圖操作,則會(huì)出現(xiàn)下圖
按住箭頭所指圖片淮韭,拖拽到桌面垢粮,之后返回到桌面,會(huì)發(fā)現(xiàn)kyfw.12306.cn.cer文件
- 導(dǎo)入到Xcode項(xiàng)目中
add file添加到項(xiàng)目中靠粪,ok蜡吧。(這樣假如失敗的話(huà),可以嘗試導(dǎo)入證書(shū)之前占键,先雙擊證書(shū)添加到鑰匙串中昔善,之后允許,最后再導(dǎo)出畔乙,再重新導(dǎo)入到項(xiàng)目中)
步驟二:xcode info.list文件相關(guān)配置
主要是設(shè)置ATS開(kāi)關(guān)和白名單(因?yàn)槭亲院灻淖C書(shū)君仆,必須要添加白名單,即自己服務(wù)器的域名牲距,否則無(wú)法訪(fǎng)問(wèn))袖订。
notice:圖中ATS下面的Allow Arbitrary Loads 若設(shè)置成YES的話(huà),則app允許http訪(fǎng)問(wèn)嗅虏,其實(shí)這樣繞過(guò)了https,但是這種情況確實(shí)非常不安全上沐,后面可以看到Charles一抓包皮服,數(shù)據(jù)全都能看的見(jiàn)。
步驟三:AFN程序代碼相關(guān)配置
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抓包驗(yàn)證
- 首先檢測(cè),google瀏覽器請(qǐng)求龄广,Charles抓包是否成功硫眯,若失敗,解決方法如下(cmd+, 快捷鍵進(jìn)入瀏覽器設(shè)置界面)
點(diǎn)擊顯示高級(jí)設(shè)置
依次找到網(wǎng)路择同,點(diǎn)擊更改代理服務(wù)器設(shè)置
把圖中箭頭所指向的勾選去掉两入,點(diǎn)擊好,最后要應(yīng)用成功
之后瀏覽器刷新一個(gè)頁(yè)面敲才,會(huì)發(fā)現(xiàn)Charles此時(shí)就會(huì)抓到內(nèi)容了裹纳。
成功抓取簡(jiǎn)書(shū)某個(gè)頁(yè)面的數(shù)據(jù)
- 在模擬器運(yùn)行你的項(xiàng)目,發(fā)現(xiàn)contents都是亂碼等紧武,表示成功
- 真機(jī)運(yùn)行項(xiàng)目
確保iOS設(shè)備跟mac在同一網(wǎng)段(用同一個(gè)wifi就ok)剃氧;
點(diǎn)擊iOS設(shè)備網(wǎng)絡(luò)詳情,找到HTTP代理阻星,選擇手動(dòng)朋鞍,服務(wù)器填寫(xiě)你mac的IP,端口填8888妥箕,配置完成滥酥。
就是紅框里面的
額外知識(shí)點(diǎn)補(bǔ)充
- AFN設(shè)置自定義User-Agent(具體應(yīng)用場(chǎng)景相應(yīng)修改)
AFHTTPSessionManager *session = [AFHTTPSessionManager manager];
//設(shè)置自定義代理參數(shù)
[session.requestSerializer setValue:[self setUserAgent] forHTTPHeaderField:@"User-Agent"];
#pragma -mark User-Agent添加參數(shù)
- (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) {
//有這個(gè)字符串
}else{
//沒(méi)有的話(huà)追加
[newAgent appendFormat:@"%@%@", @" Helloan_IOS_APP/",version_current];
}
NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:newAgent, @"UserAgent", nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];
return newAgent;
}```
* AFN 頭像上傳 客戶(hù)端接收失敗問(wèn)題(接收格式設(shè)置)
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];```
補(bǔ)充
- Allow Arbitrary Loads 這個(gè)設(shè)置成NO的情況下畦幢,域名假如是test.helloan.cn坎吻,此時(shí)沒(méi)有被假如白名單。
測(cè)試中會(huì)發(fā)現(xiàn)呛讲,ios9 webview加載空白禾怠,而ios8.3是可以正常加載的。
- 如何添加白名單(Exception Domain指的就是白名單)
Paste_Image.png
- sdwebimage請(qǐng)求圖片https設(shè)置(options:SDWebImageAllowInvalidSSLCertificates)
[self.ivHeadPortrait sd_setImageWithURL:[NSURL URLWithString:urlStringHead]
placeholderImage:[UIImage imageNamed:@"portraitDefault"] options:SDWebImageAllowInvalidSSLCertificates];
- iOS webview/wkwebview不要求配置https贝搁,http請(qǐng)求也是行的
待確定問(wèn)題
- 不知道自簽名證書(shū)吗氏,蘋(píng)果那邊認(rèn)不認(rèn),這個(gè)只能等17年1月1號(hào) 以后上傳新版本知曉雷逆,到時(shí)再更新??
(蘋(píng)果對(duì)https要求又放開(kāi)了弦讽,由之前的1月1號(hào),改成了不確定膀哲,給開(kāi)發(fā)者更多的緩沖時(shí)間往产,到目前為止自簽名證書(shū)都是可以的)