AFNetworking框架的使用和Cocoapods的安装使用

来源:互联网 发布:工具书网络出版总库 编辑:程序博客网 时间:2024/06/05 06:37

一 AFNetworking框架的使用

AFN框架的内部结构:

+ NSURLSession

1 >AFURLSessionManager
2 >AFHTTPSessionManager(封装了常用的 HTTP 方法)
—-GET;POST;UIKit + AFNetworking 分类;NSProgress :利用KVO

+ 半自动的序列化&反序列化的功能

AFURLRequestSerialization :请求的数据格式/默认是二进制的
AFURLResponseSerialization :响应的数据格式/默认是JSON格式

+ 附加功能

安全策略
—-HTTPS
—-AFSecurityPolicy
网络检测
—-对苹果的网络连接检测做了一个封装
—-AFNetworkReachabilityManager

1 发送请求GET和POST

代码块一:
#pragma mark - 登录(GET)- (void)get{    //创建管理者    AFHTTPSessionManager *sessionManager = [AFHTTPSessionManager manager];    //创建字典    NSDictionary *dictM = @{                            @"username":@"520it",                            @"pwd":@"520it",                            @"type":@"JSON",                            };    //发送请求(代码内部完成了OC转JSON)    /*     第一个参数:请求路径(1.不包含参数 2.? 3. NSString)     第二个参数:字典     第三个参数:progress 进度     第四个参数:success 成功回调        task :请求任务 task.response        responseObject:响应体信息(内部已经完成了序列化处理.JSON)     第五个参数:failure 失败的回调        error:错误信息     */    [sessionManager GET:@"http://120.25.226.186:32812/login" parameters:dictM progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {        NSLog(@"%@---%@",[responseObject class],responseObject);    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {        NSLog(@"登录失败....");    }];}
代码块二:
#pragma mark - 登录(POST)- (void)post{    //创建管理者    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];    //创建字典    NSDictionary *dict = @{                           @"username":@"520it",                           @"pwd":@"520it",                           @"type":@"JSON",                           };    //创建task任务    [manager POST:@"http://120.25.226.186:32812/login" parameters:dict progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {        NSLog(@"%@----%@",[responseObject class],responseObject);    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {    }];}

2 文件下载

需要注意的地方:在使用框架的方法中,方法内部会自动将文件剪切,但是需要我们手动创建一个文件夹,告诉系统将文件剪切到哪个地方.返回一个路径.
具体的代码:
#pragma mark - 下载- (void)download{    //创建会话管理者    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];    //确定路径    NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/resources/videos/minion_10.mp4"];    //创建请求对象    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];    //请求任务    /*     第一个参数:请求对象     第二个参数:进度回调 downloadProgress(获得进度信息)     第三个参数:destination     targetPath:文件的临时存储路径     response:响应头信息     返回值:NSURL(AFN内部已经实现了文件剪切的过程,但是需要我们告诉他应该把文件剪切到哪里)     第四个参数:completionHandler 请求完成的时候调用     response:响应头信息     filePath==fullPath 文件的最终目录     error:错误信息     */    NSURLSessionDownloadTask *download = [manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {        //totalUnitCount: 文件的总大小        //completedUnitCount: 当前下载的数据        //进度        NSLog(@"%f",1.0 * downloadProgress.completedUnitCount / downloadProgress.totalUnitCount);    } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {        //告诉系统需要将文件剪切到哪个地方去        NSString *fullPath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:response.suggestedFilename];        return [NSURL fileURLWithPath:fullPath];    } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {        NSLog(@"下载完成");    }];    //执行任务    [download resume];}

3 文件上传

注意:需要我们高数系统上传的文件路径;将文件转成二进制数
- (void)upload1{    //创建会话管理者    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];    //创建执行任务    //发送POST请求上传文件    /*     第一个参数:请求路径 NSString     第二个参数:非文件参数     第三个参数:constructingBodyWithBlock 用来拼接要上传的文件数据     第四个参数:progress进度回调     第五个参数:success 上传成功的回调     第六个参数:failure 失败后的回调     */    [manager POST:@"http://120.25.226.186:32812/upload" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {        //需要拼接上传的文件路径        //UIImage *image = [UIImage imageNamed:@"/Users/xiaofeng/Desktop/Snip20160323_1"];        //将图片转为二进制数据        //NSData *data = UIImagePNGRepresentation(image);        //上传的二进制文件//        [formData appendPartWithFileData:data name:@"file" fileName:@"XFJ-XFJ" mimeType:@"image/png"];        NSURL *fileUrl = [NSURL fileURLWithPath:@"/Users/xiaofeng/Desktop/Snip20160323_1.png"];        //上传二进制数据//        [formData appendPartWithFileURL:fileUrl name:@"file" fileName:@"Snip20160323_1.png" mimeType:@"image/png" error:nil];        //简便方法        //该方法是简单版本,该方法内部会自动的得到文件的名称以及文件的类型        [formData appendPartWithFileURL:fileUrl name:@"file" error:nil];    } progress:^(NSProgress * _Nonnull uploadProgress) {        //上传的进度        NSLog(@"%f",1.0 * uploadProgress.completedUnitCount / uploadProgress.totalUnitCount);    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {        //打印响应体信息        NSLog(@"%@",responseObject);    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {        //文件上传失败的时候调用        NSLog(@"上传失败.....");    }];}

4 AFN的序列化和反序列化

代码块一:返回的数据是oc,因为代码内部已经做了json转oc字典的操作
#pragma mark - 反序列化//AFN内部默认已经做了(反)序列化处理(JSON)- (void)json{    //创建会话管理者    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];    //创建字典    NSDictionary *dict = @{                           @"type":@"JSON"                           };    //请求任务    /*     参数一:请求的地址     参数二:字典     参数三:精度     参数四:成功回调     参数五:失败回调     */    [manager GET:@"http://120.25.226.186:32812/video" parameters:dict progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {        //打印出响应体信息        //内部已经把JOSN数据转换层OC对象(字典)        NSLog(@"%@-----%@",[responseObject class],responseObject);    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {        NSLog(@"请求失败...");    }];}
代码块二:需要手动将xml转为解析为oc(采用的是代理方法)
#pragma mark - 解析xml数据//返回的数据是xml,需要我们手动将xml转为oc- (void)xml{    //创建会话管理者    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];    //修改响应体信息的解析方式    manager.responseSerializer = [AFXMLParserResponseSerializer serializer];    //字典    NSDictionary *dict = @{                           @"type":@"XML"                           };    //发送请求任务    [manager GET:@"http://120.25.226.186:32812/video" parameters:dict progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {        //还需要自己手动将xml数据解析为oc字典        //解析        NSXMLParser *parser = (NSXMLParser *)responseObject;        //设置代理        parser.delegate = self;        //开始解析        [parser parse];        NSLog(@"%@",responseObject);    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {    }];}
代理方法:
#pragma mark - xml解析的代理数据- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict{    NSLog(@"%@-----%@",elementName,attributeDict);}
代码块三:该种解析数据的方法,对数据不做任何的处理
#pragma mark - 这种解析处理将解析出来的数据不做任何的处理- (void)httpData{    //创建会话管理者    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];    //修改数据的解析方式    manager.responseSerializer = [AFHTTPResponseSerializer serializer];    //请求任务    [manager GET:@"http://120.25.226.186:32812/resources/images/minion_02.png" parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {        //打印解析信息//        NSLog(@"%@-----%@",[responseObject class],responseObject);        NSLog(@"%@",[[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]);    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {        //解析失败回调        NSLog(@"解析失败...");    }];}
代码块四和代码块三差不多,也是不做任何的处理
- (void)httpData2{    //创建会话管理者    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];    //修改数据的解析方式    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];    manager.responseSerializer = [AFHTTPResponseSerializer serializer];    //请求任务    [manager GET:@"http://www.baidu.com" parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {        NSLog(@"%@",[[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]);        NSLog(@"%@",[responseObject class]);    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {        NSLog(@"解析失败....");    }];}

5 通过AFN框架来监听网络状态的改变

[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {        switch (status) {            case AFNetworkReachabilityStatusReachableViaWiFi:                NSLog(@"wifi");                break;            case AFNetworkReachabilityStatusReachableViaWWAN:                NSLog(@"3G|4G");                break;            case AFNetworkReachabilityStatusNotReachable:                NSLog(@"没有网络");                break;            case AFNetworkReachabilityStatusUnknown:                NSLog(@"未知");                break;            default:                break;        }    }];    //开始监听网络状态改变    [[AFNetworkReachabilityManager sharedManager] startMonitoring];

二 Cocoapods的安装使用

1.先升级Gem(需要看你mac的版本,如果是10.11以上的就不需要升级)

sudo gem update –system

2.切换cocoapods的数据源

注意:【先删除,再添加,查看】
gem sources – remove https://rubygems.org/
gem sources -a https://ruby.taobao.org/
gem sources -l

3.安装cocoapods

sudo gem install cocoapods
或者(如10.11系统)sudo gem install -n /usr/local/bin cocoapods

4.将Podspec文件托管地址从github切换到国内的oschina(该步骤可以省略)

注意:【先删除,再添加,再更新】
—> pod repo remove master
—> pod repo add master http://git.oschina.net/akuandev/Specs.git
—> pod repo add master https://gitcafe.com/akuandev/Specs.git
—> pod repo update

5.设置pod仓库

—> pod setup

6.测试

注意:【如果有版本号,则说明已经安装成功】
—> pod –version

7.利用cocoapods来安装第三方框架

01 进入要安装框架的项目的.xcodeproj同级文件夹
02 在该文件夹中新建一个文件podfile
03 在文件中告诉cocoapods需要安装的框架信息
—-> a.该框架支持的平台
—-> b.适用的iOS版本
—-> c.框架的名称
—-> d.框架的版本

8.安装

—> pod install –no-repo-update
—> pod update –no-repo-update

9.说明

—> platform :ios, ‘8.0’ 用来设置所有第三方库所支持的iOS最低版本
—> pod ‘SDWebImage’,’~>2.6’ 设置框架的名称和版本号

注意:版本号的规则:

—-> ‘>1.0’ 可以安装任何高于1.0的版本
—-> ‘>=1.0’ 可以安装任何高于或等于1.0的版本
—-> ‘<1.0’ 任何低于1.0的版本
—-> ‘<=1.0’ 任何低于或等于1.0的版本
—-> ‘~>0.1’ 任何高于或等于0.1的版本,但是不包含高于1.0的版本
—-> ‘~>0’ 任何版本,相当于不指定版本,默认采用最新版本号

10.使用pod install命令安装框架后的大致过程:

01 分析依赖:该步骤会分析Podfile,查看不同类库之间的依赖情况。如果有多个类库依赖于同一个类库,但是依赖于不同的版本,那么cocoaPods会自动设置一个兼容的版本。
02 下载依赖:根据分析依赖的结果,下载指定版本的类库到本地项目中。
03 生成Pods项目:创建一个Pods项目专门用来编译和管理第三方框架,CocoaPods会将所需的框架,库等内容添加到项目中,并且进行相应的配置。
04 整合Pods项目:将Pods和项目整合到一个工作空间中,并且设置文件链接。
1 0
原创粉丝点击