原創:http://www.zhimengzhe.com/IOSkaifa/38653.htmlphp
AFNetworking 3.0 版本使用html
在Xcode7.0以後,蘋果廢棄了NSURLConnection方法,數據請求使用NSURLSession,做爲網絡請求類第三方庫使用量最大的AFN也及時的更新的新的版本——AFN 3.0版本。新的版本的裏廢棄了基於NSURLConnection封裝的AFHTTPRequestOperationManager,轉而使用基於NSURLSession封裝的AFHTTPSessionManager了。ios
下面將詳細介紹AFN3.0的使用json
1.cocoapods導入AFN 3.0vim
1.1 進入到工程目錄下api
$ cd 工程目錄名緩存
1.2 搜索最新的AFN庫版本網絡
$ pod search AFNetworkingapp
1.3 建立podfile文件post
$ vim podfile
1.4 按下鍵盤「i」鍵,輸入以下的pod語句,而後按下「esc」鍵,退出編輯,再輸入「:wq」,保存退出vim,項目根目錄下就會新建咱們須要的podfile文件
$ platform:ios,'7.0'
$ pod 'AFNetworking','~>3.1.0'
1.5 導入AFN庫,使用以下語句導入和直接$ pod install的區別是略過cocoaPods的庫更新過程,導入速度較快
$ pod install --verbose --no-repo-update
導入成功,使用後綴名爲.xcworkspace的文件打開工程
2.配置plist文件
在Xcode 7.0以後,蘋果使用了https的網路協議,因此在網絡請求前,咱們還須要配置一下工程的Info.plist文件
右鍵Info.plist文件 -> open as -> source code ,找到下圖位置,粘貼以下代碼
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
3.使用AFN進行數據請求 3.1 請求管理類 (HttpsManager)
該類裏都是+號方法,不是單例類
在.h裏定義超時時間宏,以及成功和失敗的block塊
#define kTimeOutInterval 30 // 請求超時的時間 typedef void (^SuccessBlock)(NSDictionary *dict, BOOL success); // 訪問成功block typedef void (^AFNErrorBlock)(NSError *error); // 訪問失敗block
封裝AFN請求管理者
#pragma mark - 建立請求者 +(AFHTTPSessionManager *)manager { AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; // 超時時間 manager.requestSerializer.timeoutInterval = kTimeOutInterval; // 聲明上傳的是json格式的參數,須要你和後臺約定好,否則會出現後臺沒法獲取到你上傳的參數問題 manager.requestSerializer = [AFHTTPRequestSerializer serializer]; // 上傳普通格式 // manager.requestSerializer = [AFJSONRequestSerializer serializer]; // 上傳JSON格式 // 聲明獲取到的數據格式 manager.responseSerializer = [AFHTTPResponseSerializer serializer]; // AFN不會解析,數據是data,須要本身解析 // manager.responseSerializer = [AFJSONResponseSerializer serializer]; // AFN會JSON解析返回的數據 // 我的建議仍是本身解析的比較好,有時接口返回的數據不合格會報3840錯誤,大體是AFN沒法解析返回來的數據 return manager; }
3.2 get
+ (void)getUserCarShopAndSalesDataForSalesWithUserId:(NSString *)userId date:(NSString *)date selectAreaType:(NSString *)areaType Success:(SuccessBlock)success fail:(AFNErrorBlock)fail { // get請求也能夠直接將參數放在字典裏,AFN會本身講參數拼接在url的後面,不須要本身憑藉 NSDictionary *param = @{@"user_id":userId, @"sale_date":date, @"accessToken":@"e9c0e60318ebd07ec2fe", @"area_type":areaType}; // 建立請求類 AFHTTPSessionManager *manager = [self manager]; [manager GET:@"http://pm.yunhan-china.com/index.php/Api_sale/sales_get" parameters:param progress:^(NSProgress * _Nonnull downloadProgress) { // 這裏能夠獲取到目前數據請求的進度 } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { // 請求成功 if(responseObject){ NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil]; success(dict,YES); } else { success(@{@"msg":@"暫無數據"}, NO); } } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { // 請求失敗 fail(error); }]; }
3.3 post
+ (void)loginWithUserAccount:(NSString *)account password:(NSString *)password success:(SuccessBlock)success fail:(AFNErrorBlock)fail { // 將請求參數放在請求的字典裏 NSDictionary *param = @{@"phoneNumber":account, @"password":@"f379eaf3c831b04de153469d1bec345e"}; // 建立請求類 AFHTTPSessionManager *manager = [self manager]; [manager POST:@"http://pm.yunhan-china.com/index.php/api_common/login" parameters:param progress:^(NSProgress * _Nonnull uploadProgress) { // 這裏能夠獲取到目前數據請求的進度 } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { // 請求成功 if(responseObject){ NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil]; success(dict,YES); } else { success(@{@"msg":@"暫無數據"}, NO); } } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { // 請求失敗 fail(error); }]; }
3.4 下載
- (void)downLoadWithUrlString:(NSString *)urlString { // 1.建立管理者對象 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; // 2.設置請求的URL地址 NSURL *url = [NSURL URLWithString:urlString]; // 3.建立請求對象 NSURLRequest *request = [NSURLRequest requestWithURL:url]; // 4.下載任務 NSURLSessionDownloadTask *task = [manager 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); // 設置下載路徑,經過沙盒獲取緩存地址,最後返回NSURL對象 NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)lastObject]; return [NSURL fileURLWithPath:filePath]; // 返回的是文件存放在本地沙盒的地址 } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) { // 下載完成調用的方法 NSLog(@"%@---%@", response, filePath); }]; // 5.啓動下載任務 [task resume]; }
3.5 上傳
- (void)uploadWithUser:(NSString *)userId UrlString:(NSString *)urlString upImg:(UIImage *)upImg { // 建立管理者對象 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; // 參數 NSDictionary *param = @{@"user_id":userId}; [manager POST:urlString parameters:param constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) { /******** 1.上傳已經獲取到的img *******/ // 把圖片轉換成data NSData *data = UIImagePNGRepresentation(upImg); // 拼接數據到請求題中 [formData appendPartWithFileData:data name:@"file" fileName:@"123.png" mimeType:@"image/png"]; /******** 2.經過路徑上傳沙盒或系統相冊裏的圖片 *****/ // [formData appendPartWithFileURL:[NSURL fileURLWithPath:@"文件地址"] name:@"file" fileName:@"1234.png" 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); }]; }
3.6 網絡監聽
- (void)AFNetworkStatus{ //1.建立網絡監測者 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; } }] ; }