iOS網(wǎng)絡(luò)基礎(chǔ)之AFNetworking

AFNetworking對(duì)于iOS開發(fā)者來說是一個(gè)十分熟悉的網(wǎng)絡(luò)請(qǐng)求三方框架冕象,本文就是就是對(duì)這個(gè)優(yōu)秀三方框架的學(xué)習(xí)的一些總結(jié)主籍;首先看一下最新的AFNetworking結(jié)構(gòu)目錄:


AFNetworking結(jié)構(gòu)目錄
AFNetworking包含的模塊
  • 網(wǎng)絡(luò)請(qǐng)求模塊
  • 網(wǎng)絡(luò)監(jiān)控模塊
  • 安全策略模塊
  • 網(wǎng)絡(luò)請(qǐng)求/響應(yīng)序列化模塊
  • UIKit的擴(kuò)展模塊
AFNetworking便捷之處

AFNetworking在使用過程中僅僅需要開發(fā)者考慮,HTTP Method展氓、URL适掰、Params、回調(diào)的Block中解析響應(yīng)數(shù)據(jù)始锚、錯(cuò)誤的回調(diào)Block中處理錯(cuò)誤展示的信息;對(duì)于數(shù)據(jù)的上傳畦韭、下載疼蛾、安全策略配置等方面的支持AFNetworking更讓開發(fā)者減輕了不少開發(fā)量;

AFNetworking 的簡(jiǎn)單使用案例
 -(void)requestPhoneNumberBelong{
NSURLSessionConfiguration* sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
AFHTTPSessionManager* sessionManager = [[AFHTTPSessionManager alloc] initWithBaseURL:nil sessionConfiguration:sessionConfiguration];
[sessionManager GET:@"http://tcc.taobao.com/cc/json/mobile_tel_segment.htm" parameters:@{@"tel":@"18518487767"} success:^(NSURLSessionDataTask * _Nonnull task, id  _Nonnull responseObject) {
    NSStringEncoding gbkEncoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
    NSString *pageSource = [[NSString alloc] initWithData:responseObject encoding:gbkEncoding];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
}];
 }   
AFHTTPSessionManager的創(chuàng)建解析

創(chuàng)建sessionManger也是使用NSURLSessionConfiguration配置SessionConfiguration艺配,使用AFSecurityPolicy來配置安全策略;

AFNetworking網(wǎng)絡(luò)任務(wù)的創(chuàng)建是在哪個(gè)線程執(zhí)行的衍慎?

對(duì)于這個(gè)問題首先看一下網(wǎng)絡(luò)任務(wù)創(chuàng)建的代碼片段

    __block NSURLSessionDataTask *dataTask = nil;
dispatch_sync(url_session_manager_creation_queue(), ^{
    NSLog(@"---->%@",[NSThread currentThread]);
    dataTask = [self.session dataTaskWithRequest:request];
});     
//  url_session_manager_creation_queue 的創(chuàng)建
static dispatch_queue_t url_session_manager_creation_queue() {
static dispatch_queue_t af_url_session_manager_creation_queue;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    af_url_session_manager_creation_queue = dispatch_queue_create("com.alamofire.networking.session.manager.creation", DISPATCH_QUEUE_SERIAL);
});

return af_url_session_manager_creation_queue;

}

使用dispatch_sync在url_session_manager_creation_queue()函數(shù)返回的serial queue中執(zhí)行request的請(qǐng)求转唉,因此AFNetworking在創(chuàng)建網(wǎng)絡(luò)任務(wù)的時(shí)候所在的線程取決于你網(wǎng)絡(luò)任務(wù)發(fā)起所在的線程(主線程或是你自己創(chuàng)建的線程中);
對(duì)于這個(gè)段代碼片段究竟有什么作用稳捆?看資料的解釋是為了解決iOS 8.0以下版本中偶發(fā)的taskIdentifiers不唯一的bug赠法;

AFNetworking網(wǎng)絡(luò)任務(wù)的完成回調(diào)是在哪個(gè)線程執(zhí)行的?

首先一段代碼片段

  NSError *serializationError = nil;
NSMutableURLRequest *request = [self.requestSerializer requestWithMethod:method URLString:[[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString] parameters:parameters error:&serializationError];
if (serializationError) {
    if (failure) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wgnu"
        dispatch_async(self.completionQueue ?: dispatch_get_main_queue(), ^{
            failure(nil, serializationError);
        });
#pragma clang diagnostic pop
    }

    return nil;
}

代碼中如果NSMutableURLRequest的對(duì)象創(chuàng)建失敗,當(dāng)completionQueue為nil時(shí)砖织,會(huì)異步在main queue中執(zhí)行失敗回調(diào)款侵,也就是在主線程中處理錯(cuò)誤回調(diào);

當(dāng)數(shù)據(jù)請(qǐng)求完成會(huì)回調(diào)- (void)URLSession:(__unused NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error 方法侧纯;此方法中存在代碼片段

     dispatch_async(dispatch_get_main_queue(), ^{
                [[NSNotificationCenter defaultCenter] postNotificationName:AFNetworkingTaskDidCompleteNotification object:task userInfo:userInfo];
            });    

所以AFNetworking在NSURLSession完成數(shù)據(jù)請(qǐng)求回調(diào)之后會(huì)在主線程里發(fā)送AFNetworkingTaskDidCompleteNotification通知新锈,即AFNetworking網(wǎng)絡(luò)任務(wù)的完成回調(diào)處理是在主線程中完成的;

AFSecurityPolicy

AFSecurityPolicy可以簡(jiǎn)化客戶端配置安全策略的工作量眶熬;AFSecurityPolicy提供了三種模式:

  • AFSSLPinningModeNone:這個(gè)模式表示不做SSL pinning妹笆,只跟瀏覽器一樣在系統(tǒng)的信任機(jī)構(gòu)列表里驗(yàn)證服務(wù)端返回的證書。若證書是信任機(jī)構(gòu)簽發(fā)的就會(huì)通過娜氏,若是自己服務(wù)器生成的證書拳缠,這里是不會(huì)通過的。
  • AFSSLPinningModeCertificate:這個(gè)模式表示用證書綁定方式驗(yàn)證證書贸弥,需要客戶端保存有服務(wù)端的證書拷貝窟坐,這里驗(yàn)證分兩步,第一步驗(yàn)證證書的域名/有效期等信息绵疲,第二步是對(duì)比服務(wù)端返回的證書跟客戶端返回的是否一致哲鸳。
  • AFSSLPinningModePublicKey:這個(gè)模式同樣是用證書綁定方式驗(yàn)證,客戶端要有服務(wù)端的證書拷貝最岗,只是驗(yàn)證時(shí)只驗(yàn)證證書里的公鑰帕胆,不驗(yàn)證證書的有效期等信息。只要公鑰是正確的般渡,就能保證通信不會(huì)被竊聽懒豹,因?yàn)橹虚g人沒有私鑰,無法解開通過公鑰加密的數(shù)據(jù)驯用。
客戶端配置HTTPS的方式

客戶端驗(yàn)證HTTPS協(xié)議的一種方式是將把服務(wù)端證書(需要轉(zhuǎn)換成cer格式)放到APP項(xiàng)目資源里脸秽,AFSecurityPolicy會(huì)自動(dòng)尋找根目錄下所有cer文件

 AFSecurityPolicy *securityPolicy = [AFSecurityPolicy               policyWithPinningMode:AFSSLPinningModePublicKey];
securityPolicy.allowInvalidCertificates = YES;
 [AFHTTPRequestOperationManager manager].securityPolicy = securityPolicy;  
[manager GET:@"https://example.com/" parameters:nil         success:^(AFHTTPRequestOperation *operation, id responseObject) {
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
}];

AFNetworking2.0這個(gè)系列對(duì)源碼進(jìn)行了更詳細(xì)的解析可以參照。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蝴乔,一起剝皮案震驚了整個(gè)濱河市记餐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌薇正,老刑警劉巖片酝,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異挖腰,居然都是意外死亡雕沿,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門猴仑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來审轮,“玉大人,你說我怎么就攤上這事〖苍” “怎么了篡诽?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)榴捡。 經(jīng)常有香客問我杈女,道長(zhǎng),這世上最難降的妖魔是什么薄疚? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任碧信,我火速辦了婚禮,結(jié)果婚禮上街夭,老公的妹妹穿的比我還像新娘砰碴。我一直安慰自己,他們只是感情好板丽,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布呈枉。 她就那樣靜靜地躺著,像睡著了一般埃碱。 火紅的嫁衣襯著肌膚如雪猖辫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天砚殿,我揣著相機(jī)與錄音啃憎,去河邊找鬼。 笑死似炎,一個(gè)胖子當(dāng)著我的面吹牛辛萍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播羡藐,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼贩毕,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了仆嗦?” 一聲冷哼從身側(cè)響起辉阶,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瘩扼,沒想到半個(gè)月后谆甜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡集绰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年店印,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片倒慧。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出纫谅,到底是詐尸還是另有隱情炫贤,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布付秕,位于F島的核電站兰珍,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏询吴。R本人自食惡果不足惜掠河,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望猛计。 院中可真熱鬧唠摹,春花似錦、人聲如沸奉瘤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盗温。三九已至藕赞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間卖局,已是汗流浹背斧蜕。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留砚偶,地道東北人批销。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蟹演,于是被迫代替她去往敵國(guó)和親风钻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

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