求电影《战狼2》电影战狼2百度云资源高清资源,谢绝收费,在线等急谢谢!

2093人阅读
iOS开发(46)
详细使用方法见文章:
我们今天是来深入研究一下这个与我们日常开发密切相关的框架是如何实现的。
这是我对 AFNetworking 整个架构的理解,随后一系列的文章也会逐步分析这些模块。
在这篇文章中,我们有两个问题需要了解:
如何使用 NSURLSession 发出 HTTP 请求
如何使用 AFNetworking 发出 HTTP 请求
NSURLSession&以及与它相关的类为我们提供了下载内容的 API,这个 API 提供了一系列的代理方法来支持身份认证,并且支持后台下载。
使用&NSURLSession&来进行 HTTP 请求并且获得数据总共有五个步骤:
实例化一个&NSURLRequest/NSMutableURLRequest,设置
通过&- sharedSession&方法获取&NSURLSession
在 session 上调用&- dataTaskWithRequest:completionHandler:&方法返回一个&NSURLSessionDataTask
向 data task 发送消息&- resume,开始执行这个任务
在 completionHandler 中将数据编码,返回字符串
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[[NSURL alloc] initWithString:@&&]];
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request
completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSString *dataStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@&%@&, dataStr);
[task resume];
这一段代码可以说是使用&NSURLSession&发送请求最简单的一段代码了,当你运行这段代码会在控制台看到一坨&&首页的
&!DOCTYPE html&
lang=&en& class=&&&
prefix=&og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# object: http://ogp.me/ns/object# article: http://ogp.me/ns/article# profile: http://ogp.me/ns/profile#&&
charset='utf-8'&
AFNetworking 的使用也是比较简单的,使用它来发出 HTTP 请求有两个步骤
以服务器的主机地址或者域名生成一个 AFHTTPSessionManager 的实例
调用&- GET:parameters:progress:success:failure:&方法
AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:[[NSURL alloc] initWithString:@&hostname&]];
[manager GET:@&relative_url& parameters:nil progress:nil
success:^(NSURLSessionDataTask * _Nonnull task, id
_Nullable responseObject) {
NSLog(@&%@& ,responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@&%@&, error);
注意:在 iOS9 中,苹果默认全局 HTTPs,如果你要发送不安全的 HTTP 请求,需要在 info.plist 中加入如下键值对才能发出不安全的 HTTP 请求
还有一件事情是要注意的是,AFNetworking 默认接收 json 格式的响应(因为这是在 iOS 平台上的框架,一般不需要 text/html),如果想要返回 html,需要设置&acceptableContentTypes
在这一节中我们要分析一下在上面两个方法的调用栈,首先来看的是&AFHTTPSessionManager&的初始化方法&-
initWithBaseURL:
- [AFHTTPSessionManager initWithBaseURL:]
- [AFHTTPSessionManager initWithBaseURL:sessionConfiguration:]
- [AFURLSessionManager initWithSessionConfiguration:]
- [NSURLSession sessionWithConfiguration:delegate:delegateQueue:]
- [AFJSONResponseSerializer serializer]
- [AFSecurityPolicy defaultPolicy]
- [AFNetworkReachabilityManager sharedManager]
- [AFHTTPRequestSerializer serializer]
- [AFJSONResponseSerializer serializer]
从这个初始化方法的调用栈,我们可以非常清晰地了解这个框架的结构:
其中&AFURLSessionManager&是&AFHTTPSessionManager&的父类
AFURLSessionManager&负责生成&NSURLSession&的实例,管理&AFSecurityPolicy&和&AFNetworkReachabilityManager,来保证请求的安全和查看网络连接情况,它有一个&AFJSONResponseSerializer&的实例来序列化
AFHTTPSessionManager&有着自己的&AFHTTPRequestSerializer&和&AFJSONResponseSerializer&来管理请求和响应的序列化,同时依赖父类提供的接口保证安全、监控网络状态,实现发出
HTTP 请求这一核心功能
初始化方法很好地揭示了 AFNetworking 整个框架的架构,接下来我们要通过分析另一个方法&- GET:parameters:process:success:failure:&的调用栈,看一下
HTTP 请求是如何发出的:
- [AFHTTPSessionManager GET:parameters:process:success:failure:]
- [AFHTTPSessionManager dataTaskWithHTTPMethod:parameters:uploadProgress:downloadProgress:success:failure:]
- [AFHTTPRequestSerializer requestWithMethod:URLString:parameters:error:]
- [AFURLSessionManager dataTaskWithRequest:uploadProgress:downloadProgress:completionHandler:]
- [NSURLSession dataTaskWithRequest:]
- [AFURLSessionManager addDelegateForDataTask:uploadProgress:downloadProgress:completionHandler:]
- [AFURLSessionManagerTaskDelegate init]
- [AFURLSessionManager setDelegate:forTask:]
- [NSURLSessionDataTask resume]
在这里&#1&#2&#3&处返回的是同一个
data task,我们可以看到,在&#3&处调用的方法&-
[NSURLSession dataTaskWithRequest:]&和只使用&NSURLSession&发出 HTTP
请求时调用的方法&- [NSURLSession dataTaskWithRequest:completionHandler:]&差不多。在这个地方返回
data task 之后,我们再调用&- resume&方法执行请求,并在某些事件执行时通知代理&AFURLSessionManagerTaskDelegate
AFNetworking 实际上只是对&NSURLSession&高度地封装, 提供一些简单易用的 API 方便我们在 iOS 开发中发出网络请求并在其上更快地构建网络层组件并提供合理的接口.
到这里,这一篇文章从上到下对 AFNetworking 是如何调用的进行了一个简单的概述,我会在随后的文章中会具体介绍 AFNetworking 中的每一个模块,了解它们是如何工作,并且如何合理地组织到一起的。
二. AFNetworking框架使用方法
1.将AFNetworking文件夹导入工程;
2.添加类库:Security.framework, MobileCoreServices.framework, SystemConfiguration.framework
3. 在使用的类中或者直接在pch预编译文件内引入:#import &AFNetworking,h&
解决编译时警告:&
Prefix.pch文件中加入&
#import &SystemConfiguration/SystemConfiguration.h&&
#import &MobileCoreServices/MobileCoreServices.h&&
注:AFNetWorking使用了ARC ,在不使用ARC项目中使用时,对AFNetWorking的所有.m文件添加“-fobjc-arc”&
& & 在使用ARC项目中,使用“不使用ARC”的类库时,对类库的.m文件添加“-fno-objc-arc”&
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:198040次
积分:2981
积分:2981
排名:第10317名
原创:93篇
转载:12篇
译文:28篇
评论:207条
人生苦短,道阻且艰
修行不易,且行且努力。
港大计算机在读,擅长iOS开发和Unity3d游戏开发;
【专业兴趣】:
游戏开发,AR和VR,计算机图形学,计算机视觉,图像处理,iOS平台
【专业技能】:
iOS,Unity3d和Cocos2dx游戏开发,HTML5技术
【个人主页】:
【个人项目】:
【GitHub】:
文章:47篇
阅读:47696
文章:28篇
阅读:53781
(5)(4)(2)(7)(13)(11)(8)(20)(3)(3)(7)(2)(6)(38)(1)本篇将从四个方面对iOS开发中经常使用到的AFNetworking框架进行讲解:
一、什么是 AFN
二、为什么要使用 AFN
三、AFN 怎么用
三、AFN和ASI的区别
一、什么是 AFN
AFN 全称为 AFNetworking,是一个构建与在 NSURLConnection、NSOperation 以及其他熟悉的 Founation 技术之上的一个第三方网络框架。
二、为什么要使用 AFN
AFN 对网络请求部分做了很好的封装,并且拥有良好的架构,丰富的api,以及模块化构建方式,使得使用起来非常轻松.。
三、AFN 怎么用和他的几种使用方法
AFN 主要使用在2个场景中:
一、发送网络请求
二、实时监测网络状态
AFHTTPRequestOperationManager:内部封装的是 NSUrlConnection,网络请求管理类,用来负责发送网络请求,是使用最多的一个类.
AFHTTPSessionManager :内部封装的是 NSUrlSession,网络请求管理类,用来负责发送网络请求,是使用做多的一个类.
两个网络请求管理类定义的 API 完全相同:
[[AFHTTPRequestOperationManager manager] GET:nil parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
[[AFHTTPSessionManager manager] GET:nil parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) {
} failure:^(NSURLSessionDataTask *task, NSError *error) {
一些主要的工具类:
AFNetworkReachabilityManager.h :实时监测网络状态改变的管理类.
AFSecurityPolicy.h :HTTPS 需要使用.
AFURLRequestSerialization: 数据解析的时候会使用.
AFHTTPRequestSerializer: & 万能解析器/对服务器返回的数据不做任务处理.
AFJSONResponseSerializer:& JSON解析器.
AFXMLParserResponseSerializer:& XML解析器.
AFHTTPRequestOperationManager&对NSURLConnection的封装.
&AFHTTPSessionManager&对NSURLSession的封装.
一、AFHTTPSessionManager的基本使用步骤:
1.创建管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
2.设置管理者的数据解析类型,默认为 json 格式的解析,可手动修改为其他类型,如 XML:
manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
3.发送网络请求&
NSDictionary *dict = @{@"username":@"zhangsan",@"password":@"zhang"};
[[AFHTTPSessionManager manager] POST:@"http://localhost/login/login.php" parameters:dict progress:^(NSProgress * _Nonnull uploadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task, id
_Nullable responseObject) {
NSLog(@"responseObject:%@",responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"error:%@",error);
[[AFHTTPSessionManager manager] GET:@"http://localhost/login/login.php" parameters:dict progress:^(NSProgress * _Nonnull downloadProgress) {
NSLog(@"下载进度:%@",downloadProgress);
} success:^(NSURLSessionDataTask * _Nonnull task, id
_Nullable responseObject) {
NSLog(@"responseObject:%@",responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"error:%@",error);
&3.1 首先要明确发送的是什么类型的请求(GET/POST/HEAD...)
&3.2 AFN 3.0之后的网络接口相比之前的网络接口多了一个参数:网络进度.
&& & 1. urlString: 网络接口地址.
&& & 2. parameters: 参数字典.key:服务器接收普通参数的key值,value就是参数内容.
&& & 3. progress: 网络进度
&& & 4. success: 成功回调
&& & 5. failure: 失败回调
&3.3 AFN根据 response.MIMEType 来判断服务器返回数据的类型. 如果类型不匹配,但是又是JSON数据,解决方案:
&& & 1.改变解析器类型为:万能解析器 ---& 手动解析JSON
& & & & manager.responseSerializer = [AFHTTPResponseSerializer serializer];
&& & 2.改变判断条件的类型,以使类型匹配,acceptableContentTypes默认情况下无 text/plain 类型
& & & & manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/plain",nil];
&& & 注: 如果没有使用第三方框架(CocoaPods)来管理第三方框架,可以直接修改第三方框架的源代码.
&& & 一般在开发中,不要随意修改第三方源码.
二、AFHTTPRequestOperationManager的基本使用步骤:
1.创建管理者
AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
2.封装请求参数&
NSMutableDictionary *params = [NSMutableDictionary dictionary];
params[@"username"] = @"哈哈哈";
params[@"pwd"] = @"123";
3.发送请求
NSString *url = @"http://localhost:8080/Server/login";
[mgr POST:url parameters:params
success:^(AFHTTPRequestOperation *operation, id responseObject) {
// 请求成功的时候调用这个block
NSLog(@"请求成功---%@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
// 请求失败的时候调用调用这个block
NSLog(@"请求失败");
// GET请求
[mgr GET:url parameters:params
success:^(AFHTTPRequestOperation *operation, id responseObject) {
// 请求成功的时候调用这个block
NSLog(@"请求成功---%@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
// 请求失败的时候调用调用这个block
NSLog(@"请求失败");
三、对服务器返回数据的解析
1.AFN可以自动对服务器返回的数据进行解析
* 默认将服务器返回的数据当做JSON来解析
2.设置对服务器返回数据的解析方式
1& 当做是JSON来解析(默认做法)
* mgr.responseSerializer = [AFJSONResponseSerializer serializer];
* responseObject的类型是NSDictionary或者NSArray
2& 当做是XML来解析
* mgr.responseSerializer = [AFXMLParserResponseSerializer serializer];
* responseObject的类型是NSXMLParser
3& 直接返回data
* 意思是:告诉AFN不要去解析服务器返回的数据,保持原来的data即可
* mgr.responseSerializer = [AFHTTPResponseSerializer serializer];
* 服务器返回的数据一定要跟responseSerializer对得上
1& 服务器返回的是JSON数据
* AFJSONResponseSerializer
* AFHTTPResponseSerializer
2& 服务器返回的是XML数据
* AFXMLParserResponseSerializer
* AFHTTPResponseSerializer
3& 服务器返回的是其他数据
* AFHTTPResponseSerializer
四、实时监测网络状态
可利用 AFN 实时监测网络状态.
AFNetworkReachabilityManager 实时检测网络状态改变的类
AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
// 设置网络状态改变之后的操作
[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
// status :当前的网络状态.
AFNetworkReachabilityStatusUnknown
AFNetworkReachabilityStatusNotReachable
AFNetworkReachabilityStatusReachableViaWWAN
AFNetworkReachabilityStatusReachableViaWiFi
switch (status) {
case AFNetworkReachabilityStatusUnknown:
NSLog(@"未知的网络状态");
case AFNetworkReachabilityStatusNotReachable:
NSLog(@"没有网络");
case AFNetworkReachabilityStatusReachableViaWWAN:
NSLog(@"蜂窝移动网络");
case AFNetworkReachabilityStatusReachableViaWiFi:
NSLog(@"WIFI网络");
// 开始检测网络状态
[manager startMonitoring];
五、支持 HTTPS 网络安全传输协议下的访问
HTTPS = HTTP(超文本传输协议) + SSL (安全连接层) HTTP 的安全版本.
HTTPS 会专门建立一个 安全的数据传输通道来传输数据,外界拿不到任何数据,现阶段最安全的协议,目前在 http 模式下三大运营商发送的恶意广告泛滥,并且可以获得用户的个人信息,知乎有专门文章讲解如何到工信部投诉的内容。
HTTPS 需要数字验证,目前很多大公司使用的数字验证都是默认支持的.
[manager GET:@"" parameters:nil progress:^(NSProgress * _Nonnull downloadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task, id
_Nullable responseObject) {
NSData *data = responseO
NSLog(@"成功:%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"失败:%@",error);
AFN 默认情况下就是支持 HTTPS 访问的,但是如果用 HTTPS 的方式访问未受信任的网站便会报错,解决方案:
修改对 SSL 的检测:
AFN3.0之前:
manager.securityPolicy.allowInvalidCertificates = YES;
AFN3.0之后:
manager.securityPolicy.validatesDomainName = NO;
三、AFN和ASI的区别
一、底层实现
1& AFN的底层基于OC的NSURLConnection和NSURLSession
2& ASI的底层基于纯C语言的CFNetwork框架
3& ASI的运行性能 高于 AFN
二、对服务器返回的数据处理
1& ASI没有直接提供对服务器数据处理的方式,直接返回data\string
2& AFN提供了多种对服务器数据处理的方式
* JSON处理
* 其他处理
三、监听请求的过程
1& AFN提供了success和failure两个block来监听请求的过程(只能监听成功和失败)(3.0以后添加了进度)
* success : 请求成功后调用
* failure : 请求失败后调用
2& ASI提供了3套方案,每一套方案都能监听请求的完整过程
(监听请求开始、接收到响应头信息、接受到具体数据、接受完毕、请求失败)
* 成为代理,遵守协议,实现协议中的代理方法
* 成为代理,不遵守协议,自定义代理方法
* 设置block
四、在文件下载和文件上传的使用难易度
* 不容易监听下载进度和上传进度
* 不容易实现断点续传
* 一般只用来下载不大的文件
* 非常容易实现下载和上传
* 非常容易监听下载进度和上传进度
* 非常容易实现断点续传
* 下载或大或小的文件都行
五、ASI提供了更多的实用功能
1& 控制圈圈要不要在请求过程中转
2& 可以轻松地设置请求之间的依赖:每一个请求都是一个NSOperation对象
3& 可以统一管理所有请求(还专门提供了一个叫做ASINetworkQueue来管理所有的请求对象)
* 暂停\恢复\取消所有的请求
* 监听整个队列中所有请求的下载进度和上传进度
阅读(...) 评论()让AFNetWorking 3.x版本支持https请求 - 简书
让AFNetWorking 3.x版本支持https请求
在Xcode7.0之后,苹果废弃了NSURLConnection方法,数据请求使用NSURLSession,作为网络请求类第三方库使用量最大的AFN也及时的更新的新的版本——AFN 3.0版本。新的版本的里废弃了基于NSURLConnection封装的AFHTTPRequestOperationManager,转而使用基于NSURLSession封装的AFHTTPSessionManager了。
支持https(不校验证书,可以抓包查看):
// 1.初始化单例类
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// 2.设置非校验证书模式
manager.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
manager.securityPolicy.allowInvalidCertificates = YES;
[manager.securityPolicy setValidatesDomainName:NO];
支持https(校验证书,不可以抓包):
// 1.初始化单例类
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.securityPolicy.SSLPinningMode = AFSSLPinningModeC
// 2.设置证书模式
NSString * cerPath = [[NSBundle mainBundle] pathForResource:@"xxx" ofType:@"cer"];
NSData * cerData = [NSData dataWithContentsOfFile:cerPath];
manager.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate withPinnedCertificates:[[NSSet alloc] initWithObjects:cerData, nil]];
// 客户端是否信任非法证书
mgr.securityPolicy.allowInvalidCertificates = YES;
// 是否在证书域字段中验证域名
[mgr.securityPolicy setValidatesDomainName:NO];
本文摘自于

我要回帖

更多关于 战狼2百度云资源 的文章

 

随机推荐