寫在前面
只是對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)
打開上面給的12306鏈接,點擊https旁邊的三角感嘆號,依次如圖操作,則會出現下圖
按住箭頭所指圖片,拖拽到桌面,之后返回到桌面,會發現kyfw.12306.cn.cer文件
- 導入到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指的就是白名單)
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號,改成了不確定,給開發者更多的緩沖時間,到目前為止自簽名證書都是可以的)