iOS AFNetworking 3.0 適配HTTPS (HTTP + SSL)

這是我在簡書發(fā)的第一篇技術(shù)文章, 在工作間隙我覺得還是有必要把工作中遇到的問題, 包括調(diào)研的一些知識點做一個記錄, 希望可以對大家有所幫助.


長話短說, 直接上干貨!


ATS是在2015年由蘋果引入的強化網(wǎng)絡傳輸安全的標準引矩,要求所有的App在從Web端獲取數(shù)據(jù)的時候都要使用安全的HTTPS鏈接梁丘,并進一步強調(diào)要使用最新的TLS1.2版本的HTTPS。
首先需要服務器端升級到https旺韭,拿到服務器哥們提供的server.pem證書文件氛谜,并導入到項目中

項目地址

- (AFSecurityPolicy *)customSecurityPolicy
{
    /* 導入證書 (證書在這里暫時不能公開, 防止盜用, 主要看實現(xiàn)代碼吧)**/
    NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"duoyundong.yoger.cn" ofType:@"cer"];//證書的路徑
    NSData *certData = [NSData dataWithContentsOfFile:cerPath];
    
    // AFSSLPinningModeCertificate 使用證書驗證模式
    AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
    
    /* 如果是需要驗證自建證書,需要設置為YES**/
    securityPolicy.allowInvalidCertificates  = YES;
    securityPolicy.validatesDomainName  = NO;
    
    /** 如果certData為空會導致崩潰問題, 這里需要加一個判斷*/
    if (certData) {
        securityPolicy.pinnedCertificates = [NSSet setWithArray:@[certData]];
    }
    return securityPolicy;
}

/*** 具體還是下載測試項目, 代碼以項目為準 ***/

/**
 *  網(wǎng)絡請求 (POST / GET)
 *
 *  @param path         接口拼接路徑
 *  @param params       請求體
 *  @param method       get / post
 *  @param successBlock 成功
 *  @param failureBlock 失敗
 *  @param refreshBlock 刷新
 */
- (void)sendRequestPath:(NSString *)path
                 params:(NSDictionary *)params
                 method:(NSString *)method
                success:(APISuccessBlock)successBlock
                failure:(APIFailureBlock)failureBlock
                  error:(APIRefreshBlock)refreshBlock
{
    /** 實時監(jiān)測網(wǎng)絡狀態(tài)*/
    [[NetworkJudgement defaultInstance] judgeNetWorkIsAvailable];
    /** 初始化通知(斷網(wǎng)時接收)*/
    [self receiveNotification];
    
    
    NSString *fullPath = [NSString stringWithFormat:kMainUrl_HTTPS, path];
    
    _sessionManager = [AFHTTPSessionManager manager];
    _sessionManager.securityPolicy.allowInvalidCertificates = YES;
    _sessionManager.requestSerializer.timeoutInterval = kRequestTimeOutInterval;
    
    _sessionManager.responseSerializer = [AFJSONResponseSerializer serializer];
    [_sessionManager.responseSerializer setAcceptableContentTypes: [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html",@"text/css", nil]];
    
    // 驗證HTTP+SSL證書
    [_sessionManager setSecurityPolicy:[self customSecurityPolicy]];
    
    if ([[method lowercaseString] isEqualToString:@"get"]) {
        
        if(IOS_VERSION <= 7.0f) {
            
            fullPath = [fullPath stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
            
        } else {
            
            fullPath = [fullPath stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet characterSetWithCharactersInString:@"`#%^{}\"[]|\\<> "].invertedSet];
        }
        
        
        [_sessionManager GET:fullPath parameters:params progress:^(NSProgress * _Nonnull downloadProgress) {
            
        } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            
            [self successDataTask:task ResponseObject:responseObject success:successBlock failure:failureBlock refresh:refreshBlock];
            
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            
            [self errorOperation:failureBlock refresh:refreshBlock];
        }];
        
    } else if ([[method lowercaseString] isEqualToString:@"post"]) {
        
        if(IOS_VERSION <= 7.0f) {
            
            fullPath = [fullPath stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
            
        } else {
            
            fullPath = [fullPath stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet characterSetWithCharactersInString:@"`#%^{}\"[]|\\<> "].invertedSet];
        }
        
        
        [_sessionManager POST:fullPath parameters:params progress:^(NSProgress * _Nonnull uploadProgress) {
            
        } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            
            [self successDataTask:task ResponseObject:responseObject success:successBlock failure:failureBlock refresh:responseObject];
            
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            
            failureBlock(error);
            
//            [self errorOperation:failureBlock refresh:refreshBlock];
        }];
    }
}

AFN常見錯誤

//1.創(chuàng)建一個管理者
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

    //1.0 改請求的默認的序列化方式 改成JSON格式的請求(請求為json格式的二進制)
//會把字典区端,數(shù)組轉(zhuǎn)化成json格式的二進制傳給服務器值漫。
//默認情況下是普通的二進制,實現(xiàn)此方法改為JSON格式的二進制
    manager.requestSerializer = [AFJSONRequestSerializer serializer];

    //1.1 改默認的響應反序列化方式 改為普通二進制(服務器返回的是二進制织盼,afn不做處理)杨何。
//默認情況下 afn會做二進制轉(zhuǎn)為json的格式的處理。然后我們自己把json轉(zhuǎn)成數(shù)組悔政,或字典晚吞。
//實現(xiàn)此方法后不做處理延旧,直接將二進制說句給你谋国。也不再需要1.2 增加默認的返回方式(JSON)的可接收的類型。
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];

    //1.2 增加默認的返回方式(JSON)的可接收的類型
    //manager.responseSerializer.acceptableContentTypes = [manager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/plain"];

常見問題
注意:如果服務器升級到TLS1.1還是不行的迁沫,因為蘋果要求使用TLS1.2 SSL加密請求數(shù)據(jù)芦瘾。會造成無法接受數(shù)據(jù)

其他相關(guān)文章推薦
淺談iOS語音識別+語音播報
iOS開發(fā)中 weak和assign的區(qū)別
Objective-C沙盒結(jié)構(gòu)
淺談AutoreleasePool底層是如何實現(xiàn)的?
iOS開發(fā)中內(nèi)聯(lián)函數(shù)(UIKIT_STATIC_INLINE)的使用
鄧白氏編碼(DUNS)申請流程 (史上最全)
AppStore個人開發(fā)者賬號升級為公司賬號(鄧白氏碼DUNS申請等)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末捌蚊,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子近弟,更是在濱河造成了極大的恐慌缅糟,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件祷愉,死亡現(xiàn)場離奇詭異窗宦,居然都是意外死亡,警方通過查閱死者的電腦和手機二鳄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門赴涵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人订讼,你說我怎么就攤上這事髓窜。” “怎么了欺殿?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵寄纵,是天一觀的道長。 經(jīng)常有香客問我脖苏,道長程拭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任棍潘,我火速辦了婚禮哺壶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蜒谤。我一直安慰自己山宾,他們只是感情好,可當我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布鳍徽。 她就那樣靜靜地躺著资锰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪阶祭。 梳的紋絲不亂的頭發(fā)上绷杜,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天,我揣著相機與錄音濒募,去河邊找鬼鞭盟。 笑死,一個胖子當著我的面吹牛瑰剃,可吹牛的內(nèi)容都是我干的齿诉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼粤剧!你這毒婦竟也來了歇竟?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤抵恋,失蹤者是張志新(化名)和其女友劉穎焕议,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體弧关,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡盅安,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了世囊。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宽堆。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖茸习,靈堂內(nèi)的尸體忽然破棺而出畜隶,到底是詐尸還是另有隱情,我是刑警寧澤号胚,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布籽慢,位于F島的核電站,受9級特大地震影響猫胁,放射性物質(zhì)發(fā)生泄漏箱亿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一弃秆、第九天 我趴在偏房一處隱蔽的房頂上張望届惋。 院中可真熱鬧,春花似錦菠赚、人聲如沸脑豹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瘩欺。三九已至,卻和暖如春拌牲,著一層夾襖步出監(jiān)牢的瞬間俱饿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工塌忽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拍埠,地道東北人。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓土居,卻偏偏與公主長得像枣购,于是被迫代替她去往敵國和親嬉探。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 很可能你的應用是與一個支持HTTPS傳輸數(shù)據(jù)的服務器交互坷虑,但是并沒有使用TLS 1.2或更高。在這種情況下埂奈,你定義...
    Www劉閱讀 3,070評論 0 5
  • 三個月后迄损,許多陌生人看見它的第一句話,往往是“它是毛長账磺,還是肉多芹敌?”。我不無寵溺地說一句“小胖子垮抗!” 二月剛過完新...
    愛吃貓的黃桃蝦閱讀 443評論 1 0
  • 從2016.6.7開始氏捞,偶然間找到一個公眾號,每天打卡冒版,每天學習一個TED液茎,正是我尋覓已久。 TED大會是召集眾多...
    周洋_圖樂園閱讀 511評論 0 1
  • 在十年前生鑫時辞嗡,體檢查出蛋白尿陽性捆等,當時自己也是很無助,老公一直安慰我续室,給了我很大的信心栋烤,但在我的思想中已經(jīng)無法摸...
    幸樂并肩閱讀 277評論 0 0
  • 有人問我:是什么讓你保持每天的陽光和快樂明郭?我回答:是哪些新鮮有趣的人和事物。 新鮮有趣丰泊,對我來說簡直太重要了薯定。 ...
    陌上桃花開閱讀 815評論 0 2