亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

IOS網絡請求之AFNetWorking 3.x 使用詳情

2020-07-26 02:56:29
字體:
來源:轉載
供稿:網友

前言:

計劃把公司的網絡請求與業務解耦,所以想著學習一下網絡請求,最近學習了NSURLSession,今天來學習一下基于NSURLSession封裝的優秀開源框架AFNetWorking 3.x,之前13年做iOS開發時用的ASIHttpRequest開源框架。

AFNetWorking

AFNetWorking一款輕量級網絡請求開源框架,基于iOS和mac os 網絡進行擴展的高性能框架,大大降低了iOS開發工程師處理網絡請求的難度,讓iOS開發變成一件愉快的事情。

下載地址:AFNetworking_jb51.rar

1.)AFHTTPSessionManager請求管理者

-(AFHTTPSessionManager *)sharedManager{  AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];  //最大請求并發任務數  manager.operationQueue.maxConcurrentOperationCount = 5;  // 請求格式  // AFHTTPRequestSerializer      二進制格式  // AFJSONRequestSerializer      JSON  // AFPropertyListRequestSerializer  PList(是一種特殊的XML,解析起來相對容易)    manager.requestSerializer = [AFHTTPRequestSerializer serializer]; // 上傳普通格式    // 超時時間  manager.requestSerializer.timeoutInterval = 30.0f;  // 設置請求頭  [manager.requestSerializer setValue:@"gzip" forHTTPHeaderField:@"Content-Encoding"];  // 設置接收的Content-Type  manager.responseSerializer.acceptableContentTypes = [[NSSet alloc] initWithObjects:@"application/xml", @"text/xml",@"text/html", @"application/json",@"text/plain",nil];    // 返回格式  // AFHTTPResponseSerializer      二進制格式  // AFJSONResponseSerializer      JSON  // AFXMLParserResponseSerializer   XML,只能返回XMLParser,還需要自己通過代理方法解析  // AFXMLDocumentResponseSerializer (Mac OS X)  // AFPropertyListResponseSerializer  PList  // AFImageResponseSerializer     Image  // AFCompoundResponseSerializer    組合    manager.responseSerializer = [AFJSONResponseSerializer serializer];//返回格式 JSON  //設置返回C的ontent-type  manager.responseSerializer.acceptableContentTypes=[[NSSet alloc] initWithObjects:@"application/xml", @"text/xml",@"text/html", @"application/json",@"text/plain",nil];  return manager;}

2.)處理get請求

-(void)doGetRequest{  //創建請求地址  NSString *url=@"http://api.nohttp.net/method";  //構造參數  NSDictionary *parameters=@{@"name":@"yanzhenjie",@"pwd":@"123"};  //AFN管理者調用get請求方法  [[self shareAFNManager] GET:url parameters:parameters progress:^(NSProgress * _Nonnull downloadProgress) {    //返回請求返回進度    NSLog(@"downloadProgress-->%@",downloadProgress);  } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {    //請求成功返回數據 根據responseSerializer 返回不同的數據格式    NSLog(@"responseObject-->%@",responseObject);  } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {    //請求失敗    NSLog(@"error-->%@",error);  }];}

3.)處理post請求

-(void)doPostRequestOfAFN{  //創建請求地址  NSString *url=@"http://api.nohttp.net/postBody";  //構造參數  NSDictionary *parameters=@{@"name":@"yanzhenjie",@"pwd":@"123"};  //AFN管理者調用get請求方法  [[self shareAFNManager] POST:url parameters:parameters progress:^(NSProgress * _Nonnull uploadProgress) {    //返回請求返回進度    NSLog(@"downloadProgress-->%@",uploadProgress);  } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {    //請求成功返回數據 根據responseSerializer 返回不同的數據格式    NSLog(@"responseObject-->%@",responseObject);  } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {    //請求失敗    NSLog(@"error-->%@",error);  }];}

4.)處理文件上傳

-(void)doUploadRequest{  // 創建URL資源地址  NSString *url = @"http://api.nohttp.net/upload";  // 參數  NSDictionary *parameters=@{@"name":@"yanzhenjie",@"pwd":@"123"};  [[self shareAFNManager] POST:url parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {    NSDate* dat = [NSDate dateWithTimeIntervalSinceNow:0];    NSTimeInterval a=[dat timeIntervalSince1970];    NSString* fileName = [NSString stringWithFormat:@"file_%0.f.txt", a];        [FileUtils writeDataToFile:fileName data:[@"upload_file_to_server" dataUsingEncoding:NSUTF8StringEncoding]];    // 獲取數據轉換成data    NSString *filePath =[FileUtils getFilePath:fileName];    // 拼接數據到請求題中    [formData appendPartWithFileURL:[NSURL fileURLWithPath:filePath] name:@"headUrl" fileName:fileName mimeType:@"application/octet-stream" error:nil];      } progress:^(NSProgress * _Nonnull uploadProgress) {    // 上傳進度    NSLog(@"%lf",1.0 *uploadProgress.completedUnitCount / uploadProgress.totalUnitCount);  } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {    //請求成功    NSLog(@"請求成功:%@",responseObject);      } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {    //請求失敗    NSLog(@"請求失?。?@",error);  }];}

5.)處理文件下載

-(void)doDownLoadRequest{  NSString *urlStr =@"http://images2015.cnblogs.com/blog/950883/201701/950883-20170105104233581-62069155.png";  // 設置請求的URL地址  NSURL *url = [NSURL URLWithString:urlStr];  // 創建請求對象  NSURLRequest *request = [NSURLRequest requestWithURL:url];  // 下載任務  NSURLSessionDownloadTask *task = [[self shareAFNManager] downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {    // 下載進度    NSLog(@"當前下載進度為:%lf", 1.0 * downloadProgress.completedUnitCount / downloadProgress.totalUnitCount);  } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {    // 下載地址    NSLog(@"默認下載地址%@",targetPath);    //這里模擬一個路徑 真實場景可以根據url計算出一個md5值 作為fileKey    NSDate* dat = [NSDate dateWithTimeIntervalSinceNow:0];    NSTimeInterval a=[dat timeIntervalSince1970];    NSString* fileKey = [NSString stringWithFormat:@"/file_%0.f.txt", a];    // 設置下載路徑,通過沙盒獲取緩存地址,最后返回NSURL對象    NSString *filePath = [FileUtils getFilePath:fileKey];    return [NSURL fileURLWithPath:filePath]; // 返回的是文件存放在本地沙盒的地址  } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {    // 下載完成調用的方法    NSLog(@"filePath---%@", filePath);    NSData *data=[NSData dataWithContentsOfURL:filePath];    UIImage *image=[UIImage imageWithData:data];    // 刷新界面...    UIImageView *imageView =[[UIImageView alloc]init];    imageView.image=image;    [self.view addSubview:imageView];    [imageView mas_makeConstraints:^(MASConstraintMaker *make) {      make.center.equalTo(self.view);      make.size.mas_equalTo(CGSizeMake(300, 300));    }];  }];  //啟動下載任務  [task resume];}

6.)網絡狀態監聽

- (void)aFNetworkStatus{    //創建網絡監測者  AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];    /*枚舉里面四個狀態 分別對應 未知 無網絡 數據 WiFi   typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) {   AFNetworkReachabilityStatusUnknown     = -1,   未知   AFNetworkReachabilityStatusNotReachable   = 0,    無網絡   AFNetworkReachabilityStatusReachableViaWWAN = 1,    蜂窩數據網絡   AFNetworkReachabilityStatusReachableViaWiFi = 2,    WiFi   };   */    [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {    //這里是監測到網絡改變的block 可以寫成switch方便    //在里面可以隨便寫事件    switch (status) {      case AFNetworkReachabilityStatusUnknown:        NSLog(@"未知網絡狀態");        break;      case AFNetworkReachabilityStatusNotReachable:        NSLog(@"無網絡");        break;              case AFNetworkReachabilityStatusReachableViaWWAN:        NSLog(@"蜂窩數據網");        break;              case AFNetworkReachabilityStatusReachableViaWiFi:        NSLog(@"WiFi網絡");        break;              default:        break;    }      }] ;    [manager startMonitoring];}

AFNetWorking內存泄露

 通常情況我們一般會認為以manager結尾的都是單例模式,所以我們一般都是這樣使用AFNetWorking,如下

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

其實我們點進去查看源碼發現并不是單例,而是每次都實例化一個AFHTTPSessionManager對象,源碼如下

+ (instancetype)manager {  return [[[self class] alloc] initWithBaseURL:nil];}

所以我們在使用AFNetWorking的時候要對AFHTTPSessionManager進行單例封裝

+ (AFHTTPSessionManager *)sharedManager{  static AFHTTPSessionManager *manager = nil;  static dispatch_once_t predicate;  dispatch_once(&predicate, ^{    manager = [AFHTTPSessionManager manager];    manager.operationQueue.maxConcurrentOperationCount = 5;    manager.requestSerializer.timeoutInterval=30.f;    manager.responseSerializer.acceptableContentTypes = [[NSSet alloc] initWithObjects:@"application/xml", @"text/xml",@"text/html", @"application/json",@"text/plain",nil];    [manager.requestSerializer setValue:@"gzip" forHTTPHeaderField:@"Content-Encoding"];      });  return manager;}

AFNetWorking關于HTTPS

 在2017年1月1日起Apple 要求開發者于年底之前為提交至 App Store 中的應用啟用 HTTPS ,以支持 iOS 9 引入的 ATS(App Transport Security)技術。但后來,apple 發布聲明宣布延長這個時限,提供給開發者更多的時間進行相關準備。目前 Apple 尚未公布新的截止日期。所以目前應對https的方案有兩種。

第一種方式:

屏蔽調iOS ATS(App Transport Security),在pList.info文件中添加如下代碼

<key>NSAppTransportSecurity</key>   <dict>     <key>NSAllowsArbitraryLoads</key>     <true/>  </dict> 

第二種方式:

配置https CA證書,這里采用獲取NSBundle中獲取CA證書,AFNetWorking提供了配置AFSecurityPolicy模塊

+ (AFSecurityPolicy *)customSecurityPolicy{  //Https CA證書地址  NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"XueLeTSHTTPS" ofType:@"cer"];  //獲取CA證書數據  NSData *cerData = [NSData dataWithContentsOfFile:cerPath];  //創建AFSecurityPolicy對象  AFSecurityPolicy *security = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];  //設置是否允許不信任的證書(證書無效、證書時間過期)通過驗證 ,默認為NO.  security.allowInvalidCertificates = YES;  //是否驗證域名證書的CN(common name)字段。默認值為YES。  security.validatesDomainName = NO;  //根據驗證模式來返回用于驗證服務器的證書  security.pinnedCertificates = [NSSet setWithObject:cerData];  return security;}

然后通過設置AFHTTPSessionManager的securityPolicy屬性等于自定義的AFSecurityPolicy。

總結:

簡單記錄一下AFNetWorking的基本使用,方便以后查找。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩在线播放视频| 亚洲精品电影在线| 欧美性一区二区三区| 亚洲精品日韩在线| 精品国产电影一区| 98精品在线视频| 亚洲一区二区三区乱码aⅴ| 国外成人免费在线播放| 亚洲免费一级电影| 一区二区欧美在线| 欧美夫妻性生活视频| 亚洲国产精品久久精品怡红院| 国产精品视频自拍| 2019亚洲日韩新视频| 国产精品高清免费在线观看| 亚洲天堂免费观看| 日韩av中文字幕在线播放| 性欧美长视频免费观看不卡| 欧洲精品在线视频| 亚洲一区二区三区四区视频| 久热在线中文字幕色999舞| 欧美亚洲国产日韩2020| 777777777亚洲妇女| 国产噜噜噜噜噜久久久久久久久| 亚洲激情在线观看| 亚洲精品黄网在线观看| 日韩一区二区三区在线播放| 亚洲第一级黄色片| 亚洲摸下面视频| 亚洲成av人片在线观看香蕉| 午夜免费久久久久| 亚洲国产精品女人久久久| 色爱av美腿丝袜综合粉嫩av| 国产精品稀缺呦系列在线| 精品国产成人av| 亚洲精品欧美日韩专区| 57pao国产成人免费| 久久综合伊人77777尤物| 精品偷拍一区二区三区在线看| 777午夜精品福利在线观看| 日本不卡视频在线播放| 欧洲美女免费图片一区| 亚洲成人教育av| 亚洲日韩第一页| 精品成人av一区| 亚洲色图17p| 精品美女永久免费视频| 91精品国产沙发| 国产精品欧美激情| 在线色欧美三级视频| 最近2019年中文视频免费在线观看| 亚洲综合自拍一区| 米奇精品一区二区三区在线观看| 欧美老少做受xxxx高潮| 欧美xxxx综合视频| 不卡av在线播放| 热99精品只有里视频精品| 亚洲精品小视频在线观看| 亚洲免费高清视频| 亚洲午夜精品久久久久久久久久久久| 538国产精品视频一区二区| 亚洲精品v天堂中文字幕| 欧美日韩国产二区| 欧美最猛性xxxxx(亚洲精品)| 亚洲自拍偷拍色片视频| 国产视频在线观看一区二区| 狠狠色噜噜狠狠狠狠97| 欧美成人午夜免费视在线看片| 美女久久久久久久久久久| 欧美一级黑人aaaaaaa做受| 久久精品在线播放| 国产一区二区三区久久精品| 91精品国产自产91精品| 欧美电影免费播放| 亚洲美女精品久久| 亚洲欧美在线一区| 亚洲自拍另类欧美丝袜| 性色av香蕉一区二区| 精品人伦一区二区三区蜜桃网站| 欧美激情一二三| 91国产视频在线播放| 欧美日韩国产在线播放| 久久天堂av综合合色| 精品中文字幕在线2019| 欧美日韩成人黄色| 亚洲性69xxxbbb| 国产精品久久一| 精品一区二区三区四区在线| 亚洲综合小说区| 日韩中文字幕欧美| 国产不卡在线观看| 国产欧美精品一区二区三区-老狼| 国产丝袜一区二区| 91探花福利精品国产自产在线| 国产大片精品免费永久看nba| www欧美日韩| 国产精品日韩在线一区| 国产亚洲人成a一在线v站| 久热精品在线视频| 美女扒开尿口让男人操亚洲视频网站| 中文字幕亚洲欧美日韩2019| 亚洲一区制服诱惑| 久久人人爽人人爽人人片av高请| 精品中文字幕在线观看| 亚洲人成在线一二| 国产成人自拍视频在线观看| 91av视频在线观看| 欧美另类极品videosbestfree| 欧美香蕉大胸在线视频观看| 亚洲bt欧美bt日本bt| 91精品国产91久久久| 三级精品视频久久久久| 51视频国产精品一区二区| 欧美激情视频一区| 国产精品中文字幕在线| 国产精品免费网站| 97超碰国产精品女人人人爽| 久久久成人av| 亚洲第一黄色网| 日韩精品免费一线在线观看| 欧美不卡视频一区发布| 中文日韩电影网站| 亚洲精品国产精品乱码不99按摩| www欧美日韩| 宅男66日本亚洲欧美视频| 久久久成人的性感天堂| 日韩成人久久久| 国产福利成人在线| 日韩一区二区久久久| 国产精品男女猛烈高潮激情| 中文字幕日韩有码| 欧美视频二区36p| 在线成人激情黄色| 国产一区二区三区精品久久久| 欧美专区第一页| 国产不卡在线观看| 96精品久久久久中文字幕| 精品爽片免费看久久| 国产精品男人的天堂| 国产福利精品av综合导导航| 精品亚洲一区二区三区在线播放| 久久久久久亚洲| 91成人精品网站| 欧美亚洲另类视频| 川上优av一区二区线观看| 91久久精品久久国产性色也91| 国产精品一区二区三| 色综合久综合久久综合久鬼88| 久久人人看视频| 欧美激情中文字幕乱码免费| 亚洲精品美女在线观看播放| 亚洲影院高清在线| 午夜免费久久久久| 欧美一区二区三区精品电影| 欧美国产日韩免费| 中文字幕日韩专区| 欧美精品一区三区| 亚洲日韩第一页| 精品久久久久久| 精品久久久久久久久久| 欧美日韩福利在线观看| 午夜精品一区二区三区在线| 国产在线观看不卡| 久久久久久久香蕉网|