✈️

扩大
缩小
回到顶部

iOS开发--AFN框架基本使用

iOS开发--AFN框架基本使用

技术概述

AFNetworking是目前国内开发网络应用使用最多的第三方框架,专为 Mac OS & iOS 设计的一套网络框架,对 NSURLConnection 和 NSURLSession 做了封装,提供有丰富的 API,同时提供了完善的错误解决方案,使用简单。

技术详述

使用案例

我在此次团队开发项目中使用AFNetworking请求后端接口,给后端发送数据,图片文件。
例如访问新增日记的接口:
图1
图2

步骤

1.创建会话管理者manager

2.发送POST/GET请求

第一个参数:请求路径(不包含参数).NSString

第二个参数:字典(发送给服务器的数据~参数)

第三个参数:constructingBodyWithBlock 处理要上传的文件数据

第四个参数:progress 进度回调

第五个参数:success 成功回调

responseObject:响应体信息(JSON--->OC对象)

第六个参数:failure 失败回调

error:错误信息

数据格式

  • 请求数据格式:AFURLRequestSerialization
类型 说明
AFHTTPRequestSerializer 二进制的,默认的
AFJSONRequestSerializer JSON(POST JSON) RESTful 设计风格需要
AFPropertyListRequestSerializer PList(POST Plist-开发中几乎不用)
  • 响应数据格式:AFURLResponseSerialization
类型 说明
AFHTTPResponseSerializer HTTP 二进制的
AFJSONResponseSerializer JSON 默认的
AFXMLParserResponseSerializer XML Parser 解析器 SAX 解析

常见功能

  • 发送GET/POST请求

    NSDictionary *dic1=@{
                                                                                  @"phone":_phone, @"username":alert.textFields[0].text
                                                                                  };
                                                             AFHTTPSessionManager *manager1=[AFHTTPSessionManager manager];
                                                             manager1.requestSerializer = [AFJSONRequestSerializer serializer];
                                                             manager1.responseSerializer = [AFHTTPResponseSerializer serializer];
                                                             [manager1 POST:@"http://localhost:8080/OneDay/user/username" parameters:dic1 progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
                                                                 NSLog(@"%@",responseObject);
                                                                 [[NSUserDefaults standardUserDefaults] setObject:alert.textFields[0].text forKey:@"username"];
                                                                 _username=alert.textFields[0].text;
                                                                 [[NSUserDefaults standardUserDefaults] synchronize];
                                                                 [self.tableview reloadData];
                                                                 
                                                             } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
                                                                 NSError *err=error;
                                                                 NSLog(@"%@",err);
                                                                 UIAlertController *alert=[UIAlertController alertControllerWithTitle:@"提示" message:@"修改昵称失败" preferredStyle:UIAlertControllerStyleAlert];
                                                                 [alert addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:nil]];
                                                                 [self presentViewController:alert animated:YES completion:nil];
                                                             }];
    
  • 下载/上传文件
    上传图片:

	 AFHTTPSessionManager *manager=[AFHTTPSessionManager manager];
    
    manager.requestSerializer = [AFHTTPRequestSerializer serializer];
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    [manager POST:@"http://localhost:8080/OneDay/user/profilePhoto" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData)
    {
        NSData *data1=[_phone  dataUsingEncoding:NSUTF8StringEncoding];
        [formData appendPartWithFormData:data1 name:@"phone"];
        NSData *data=UIImageJPEGRepresentation(image, 0.7);
        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
        formatter.dateFormat = @"yyyyMMddHHmmss";
        NSString *str = [formatter stringFromDate:[NSDate date]];
        NSString *fileName = [NSString stringWithFormat:@"%@.jpg", str];
        //上传文件参数
        [formData appendPartWithFileData:data name:@"photo" fileName:fileName mimeType:@"image/jpeg"];
        
    } progress:^(NSProgress * _Nonnull uploadProgress) {
        //打印上传进度
        CGFloat progress = 100.0 * uploadProgress.completedUnitCount / uploadProgress.totalUnitCount;
        NSLog(@"%.2lf%%", progress);
        
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        
        //成功之后修改phone
        NSDictionary *dic1=@{
         @"phone":_phone,
         @"password":_password,
         };
        AFHTTPSessionManager *manager1=[AFHTTPSessionManager manager];
        manager1.requestSerializer = [AFJSONRequestSerializer serializer];
        manager1.responseSerializer = [AFJSONResponseSerializer serializer];
         [manager1 POST:@"http://localhost:8080/OneDay/user/login" parameters:dic1 progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
         NSDictionary *nsdic=responseObject;
         NSLog(@"%@",nsdic);
             [[NSUserDefaults standardUserDefaults] setObject:[nsdic objectForKey:@"photo"] forKey:@"photo"];
             [[NSUserDefaults standardUserDefaults] synchronize];

        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
             NSError *err=error;
             NSLog(@"%@",err);

             }];
        NSLog(@"请求成功:%@",responseObject);
        
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        
        //请求失败
        NSLog(@"请求失败:%@",error);
        
    }];	

附加功能

  • 安全策略
    • HTTPS
    • AFSecurityPolicy
  • 网络检测
    • 对苹果的网络连接检测做了一个封装
    • AFNetworkReachabilityManager
	//创建一个单例manager
AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
//监测网络状态改变
[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
switch (status) {
case AFNetworkReachabilityStatusUnknown:
NSLog(@"没有网络");
break;
case AFNetworkReachabilityStatusNotReachable:
NSLog(@"连接到路由器网络不能到达");
break;
case AFNetworkReachabilityStatusReachableViaWWAN:
NSLog(@"2G/3G/4G");
break;
case AFNetworkReachabilityStatusReachableViaWiFi:
NSLog(@"wifi");
break;
}
}];
//开启检测
[manager startMonitoring];

技术使用中遇到的问题

  • 3840报错
    图3
  • 1016报错
    在进行网络请求时出现-1016 是因为只支持text/json,application/json,text/javascript你可以添加text/html或其他
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html",@"application/json",nil];

总结

AFNetworking是iOS开发中常使用的框架,一个构建在 NSURLConnection、NSOperation 以及其他熟悉的 Founation 技术之上的一个第三方网络框架,主要使用在发送网络请求以及实时监测网络状态的两个场景中,对网络请求部分做了很好的封装,并且拥有良好的架构,丰富的api,以及模块化构建方式,使用起来非常轻松,post和get请求管理类定义api完全相同。

参考博客1

参考博客2

posted on 2020-06-25 11:39  sw14  阅读(555)  评论(0编辑  收藏  举报

导航