iOS AFN之https配置小結

寫在前面

只是對AFN https配置一個簡單的總結,想深入研究的大咖,請繞行哦??

正題

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號,改成了不確定,給開發者更多的緩沖時間,到目前為止自簽名證書都是可以的)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容