一 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",
};
[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",
};
[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];
NSURLSessionDownloadTask *download = [manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {
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];
[manager POST:@"http://120.25.226.186:32812/upload" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
NSURL *fileUrl = [NSURL fileURLWithPath:@"/Users/xiaofeng/Desktop/Snip20160323_1.png"];
[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 - 反序列化
- (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) {
NSLog(@"%@-----%@",[responseObject class],responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"请求失败...");
}];
}
代码块二:需要手动将xml转为解析为oc(采用的是代理方法)
#pragma mark - 解析xml数据
- (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) {
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(@"%@",[[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.说明
—> 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和项目整合到一个工作空间中,并且设置文件链接。