大体模块如下:
除去Support Files,可以看出AFNetworking主要有5个模块
1.NSURLSession(网络通信模块)
2.Reachability(网络状态检测模块)
3.Security(网络安全模块)
4.Serialization(序列化/反序列化模块)
5.UIKit(对iOS UIKit的扩展)
NSURLSession(网络通信模块)
由AFHTTPSessionManager
和AFURLSessionManager
组成,通常我们在使用AFNetworking时,都是使用AFHTTPSessionManager
,AFHTTPSessionManager
继承自AFURLSessionManager
,是对AFURLSessionManager
的进一步封装,封装了许多繁琐的API,仅留下GET
,POST
等少数几个实用的API
最基本的使用方式如下:
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
[manager POST:@"" parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"success");
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"failure");
}];
Reachability(网络状态检测模块)
用于获取设备的网络状态,AFNetworkReachabilityStatus表示不同的网络状态,是枚举类型
typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) {
//未知网络
AFNetworkReachabilityStatusUnknown = -1,
//无网络
AFNetworkReachabilityStatusNotReachable = 0,
//手机流量
AFNetworkReachabilityStatusReachableViaWWAN = 1,
//wifi
AFNetworkReachabilityStatusReachableViaWiFi = 2,
};
最基本的使用方式如下:
AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager manager];
[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
switch (status) {
case AFNetworkReachabilityStatusNotReachable: {
NSLog(@"网络不可用");
break;
}
case AFNetworkReachabilityStatusReachableViaWiFi: {
NSLog(@"Wifi已开启");
break;
}
case AFNetworkReachabilityStatusReachableViaWWAN: {
NSLog(@"你现在使用的流量");
break;
}
case AFNetworkReachabilityStatusUnknown: {
NSLog(@"你现在使用的未知网络");
break;
}
default:{
NSLog(@"error");
break;
}
}
}];
[manager startMonitoring];
Security(网络安全模块)
AFSecurityPolicy用于验证HTTP请求时证书是否正确,避免中间人攻击,SSLPinningMode是校验证书的模式,是枚举类型
typedef NS_ENUM(NSUInteger, AFSSLPinningMode) {
//默认
AFSSLPinningModeNone,
//比较证书的公钥
AFSSLPinningModePublicKey,
//比较证书
AFSSLPinningModeCertificate,
};
AFSecurityPolicy提供的SSL Pinning的方式验证,把服务端下发的证书保存在APP的bundle中,之后通过和本地证书的比较来验证是否安全,获取bundle中的证书用以下方法:
+ (NSSet *)certificatesInBundle:(NSBundle *)bundle;
AFSSLPinningModeNone
:默认的方式,不做SSL pinning验证,跟浏览器一样在系统信任机构列表里验证服务端返回的证书,若证书是信任机构签发的,则通过,否则不通过(使用个人服务器证书时)
AFSSLPinningModeCertificate
:采用SSL Pinning的方式,首先验证服务器证书的有效期、身份信息等,然后将该证书和bundle中证书进行比较,是否一致。
AFSSLPinningModePublicKey
:采用SSL Pinning的方式,但不验证有效期,身份信息等信息,仅仅比较两个证书的公钥是否一致。
Serialization(序列化/反序列化模块)
由对请求配置封装的AFURLRequestSerialization
和对相应配置封装的AFURLResponseSerialization
组成
在使用AFHTTPSessionManager
时,会在init
方法中初始化AFURLRequestSerialization
和AFURLResponseSerialization
- (instancetype)initWithBaseURL:(NSURL *)url
sessionConfiguration:(NSURLSessionConfiguration *)configuration
{
//····省略前边的代码
self.requestSerializer = [AFHTTPRequestSerializer serializer];
self.responseSerializer = [AFJSONResponseSerializer serializer];
return self;
}
当然,在实际使用时可以根据需求对AFURLRequestSerialization
和AFURLResponseSerialization
进行一定的配置,比如:
manager.requestSerializer = [AFJSONRequestSerializer serializer];//请求格式为json
manager.responseSerializer = [AFJSONResponseSerializer serializer];//返回格式为json
AFURLRequestSerialization
的类型如下:
//二进制格式
@interface AFHTTPRequestSerializer : NSObject
//json格式
@interface AFJSONRequestSerializer : AFHTTPRequestSerializer
//PList格式
@interface AFPropertyListRequestSerializer : AFHTTPRequestSerializer
AFURLResponseSerialization
的类型如下:
//二进制格式
@interface AFHTTPResponseSerializer : NSObject
//返回JSON格式
//- `application/json`
// - `text/json`
// - `text/javascript`
@interface AFJSONResponseSerializer : AFHTTPResponseSerializer
//XML,只能返回XMLParser,还需要自己通过代理方法解析
// - `application/xml`
// - `text/xml`
@interface AFXMLParserResponseSerializer : AFHTTPResponseSerializer
//XML
// - `application/xml`
// - `text/xml`
#ifdef __MAC_OS_X_VERSION_MIN_REQUIRED
@interface AFXMLDocumentResponseSerializer : AFHTTPResponseSerializer
//PList
//- `application/x-plist`
@interface AFPropertyListResponseSerializer : AFHTTPResponseSerializer
//Image
// - `image/tiff`
// - `image/jpeg`
// - `image/gif`
// - `image/png`
// - `image/ico`
// - `image/x-icon`
// - `image/bmp`
// - `image/x-bmp`
// - `image/x-xbitmap`
// - `image/x-win-bitmap`
@interface AFImageResponseSerializer : AFHTTPResponseSerializer
//组合
@interface AFCompoundResponseSerializer : AFHTTPResponseSerializer
在使用AFHTTPSessionManager
时对AFURLRequestSerialization
和AFURLResponseSerialization
进行配置如下:
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// 设置请求格式
manager.requestSerializer = [AFJSONRequestSerializer serializer];
// 设置请求头
[manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
// 设置接收格式
manager.responseSerializer = [AFJSONResponseSerializer serializer];
// 设置接收的Content-Type
manager.responseSerializer.acceptableContentTypes = [[NSSet alloc] initWithObjects:@"application/xml", @"text/xml",@"text/html", @"application/json",@"text/plain",nil];