AFNetworking是为iOS和Mac OS X系统提供的一个简单方便的网络库。它是建立在基础URL加载系统,扩展为非常高级的网络抽象,成为Cocoa的组成部分。它有一个设计完美的模块化架构,有个很多方便使用并功能多样的接口。也许最重要的特色,无论如何,应该是为每天使用AFNetworking或给AFNetworking提供帮助的开发者提供令人惊喜的社区。AFNetworking在iPhone,iPad和Mac上被一些最受欢迎和受人好评的应用使用。
在你的下一个项目或移植你的当前项目选择使用AFNetworking,你将会非常高兴你现在的选择。
怎么开始
- 下载AFNetworking和试用其中包含的Mac和iPhone的样例应用
- 阅读[“开始”指南](https://github.com/AFNetworking/AFNetworking/wiki/Getting-Started-with-AFNetworking ""开始"指南"),FAQ或其他在wiki上的文章
- 看看关于AFNetworking全面的接口的文档
- 阅读从2.0到3.0架构改变的AFNetworking 3.0 迁移指南
交流
- 如果你需要帮助,使用Stack Overflow。(标签‘afnetworking’)
- 如果你想问问题,使用Stack Overflow。
- 如果你发现bug并且能够提供重现的步骤,请新开一个issue。
- 如果你有一个新特性请求,请新开一个issue。
- 如果你想为AFNetworking添砖加瓦,请提交一个pull请求。
安装
在工程中使用AFNetworking库,AFNetworking提供了多种安装方法。
PODFILE
使用CocoaPods继承AFNetworking到你的Xcode工程中,在你的Podfile中添加以下内容:
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'
pod 'AFNetworking', '~> 3.0'
然后,执行以下命令:
pod install
要求
AFNetworking版本 | iOS最低版本 | OS X最低版本 | watchOS最低版本 | tvOS最低版本 | 注意 |
---|---|---|---|---|---|
3.x | iOS 7 | OSX 10.9 | watchOS 2.0 | tvOS 9.0 | 必须使用Xcode7及以上.NSURLConnectionOperation已经移除 |
2.6->2.6.3 | iOS 7 | OS X 10.9 | watchOS 2.0 | n/a | 必须使用Xcode7及以上 |
2.0->2.5.4 | iOS 6 | OS X10.8 | n/a | n/a | 必须使用Xcode5及以上。NSURLSession需要iOS 7 或 OS X10.9 |
1.x | iOS 5 | Mac OS X 10.7 | n/a | n/a | 无 |
0.10.x | iOS 4 | Mac OS X 10.6 | n/a | n/a | 无 |
(OS X必须支持64位的Cocoa runtime)如果项目是使用Swift编写,请尝试使用Alamofire.
架构
NSURLSession
- AFURLSessionManager
- AFHTTPSessionManager
序列化
- AFHTTPRequestSerializer
- AFJSONRequestSerializer
- AFPropertyListRequestSerializer
- AFHTTPResponseSerializer
- AFJSONResponseSerializer
- AFXMLParserResponseSerializer
- AFXMLDocumentResponseSerializer (Mac OS X)
- AFPropertyListResponseSerializer
- AFImageResponseSerializer
- AFCompoundResponseSerializer
额外方法
- AFSecurityPolicy
- AFNetworkReachabilityManager
使用
AFURLSessionManager
AFURLSessionManager创建和管理一个在NSURLSeesionConfigutarion对象基础上的NSURLSession对象,并遵循
创建一个下载任务
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];
NSURL *URL = [NSURL URLWithString:@"http://example.com/download.zip"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
NSURL *documentsDirectoryURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil];
return [documentsDirectoryURL URLByAppendingPathComponent:[response suggestedFilename]];
} completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
NSLog(@"File downloaded to: %@", filePath);
}];
[downloadTask resume];
创建一个上传任务
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];
NSURL *URL = [NSURL URLWithString:@"http://example.com/upload"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
NSURL *filePath = [NSURL fileURLWithPath:@"file://path/to/image.png"];
NSURLSessionUploadTask *uploadTask = [manager uploadTaskWithRequest:request fromFile:filePath progress:nil completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
if (error) {
NSLog(@"Error: %@", error);
} else {
NSLog(@"Success: %@ %@", response, responseObject);
}
}];
[uploadTask resume];
创建一个上传多重部分请求的任务,并显示上传进度
NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:@"http://example.com/upload" parameters:nil constructingBodyWithBlock:^(id formData) {
[formData appendPartWithFileURL:[NSURL fileURLWithPath:@"file://path/to/image.jpg"] name:@"file" fileName:@"filename.jpg" mimeType:@"image/jpeg" error:nil];
} error:nil];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
NSURLSessionUploadTask *uploadTask;
uploadTask = [manager
uploadTaskWithStreamedRequest:request
progress:^(NSProgress * _Nonnull uploadProgress) {
// This is not called back on the main queue.
// You are responsible for dispatching to the main queue for UI updates
dispatch_async(dispatch_get_main_queue(), ^{
//Update the progress view
[progressView setProgress:uploadProgress.fractionCompleted];
});
}
completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) {
if (error) {
NSLog(@"Error: %@", error);
} else {
NSLog(@"%@ %@", response, responseObject);
}
}];
[uploadTask resume];
创建一个获取数据的任务
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];
NSURL *URL = [NSURL URLWithString:@"http://httpbin.org/get"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
NSURLSessionDataTask *dataTask = [manager dataTaskWithRequest:request completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
if (error) {
NSLog(@"Error: %@", error);
} else {
NSLog(@"%@ %@", response, responseObject);
}
}];
[dataTask resume];
请求序列化
请求序列化从URL字符串创建请求,编码参数成为一个查询字符串或HTTP内容。
NSString *URLString = @"http://example.com";
NSDictionary *parameters = @{@"foo": @"bar", @"baz": @[@1, @2, @3]};
查询字符串参数编码
[[AFHTTPRequestSerializer serializer] requestWithMethod:@"GET" URLString:URLString parameters:parameters error:nil];
编码后为
GET http://example.com?foo=bar&baz[]=1&baz[]=2&baz[]=3
URL格式参数编码
[[AFHTTPRequestSerializer serializer] requestWithMethod:@"POST" URLString:URLString parameters:parameters error:nil];
编码后为
POST http://example.com/
Content-Type: application/x-www-form-urlencoded
foo=bar&baz[]=1&baz[]=2&baz[]=3
JSON参数编码
[[AFJSONRequestSerializer serializer] requestWithMethod:@"POST" URLString:URLString parameters:parameters error:nil];
编码后为
POST http://example.com/
Content-Type: application/json
{"foo": "bar", "baz": [1,2,3]}
网络可达性管理
AFNetworkReachabilityManager监控域和IP地址通过WWAN和WiFi网络是否可达。
- 不要使用可达性去判断原始请求是否需要发送。(应该尝试的发送)
- 你可以使用可达性去判断,一个请求是否应该自动重发。(虽然它可能仍然失败,但是收到网络连接可用的可达性通知后,非常合适再去重试发送)
- 网络可达性是判断一个请求失败的原因的最好工具。(当一个网络请求失败后,告诉用户已经离线了比显示一个比如“请求超时”的技术信息好,所以提示很正确)
你也可以看WWDC 2012 706讲 “网络最好实践”.
共享的网络可达性
[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
NSLog(@"Reachability: %@", AFStringFromNetworkReachabilityStatus(status));
}];
[[AFNetworkReachabilityManager sharedManager] startMonitoring];
安全策略
AFSecurityPolicy通过X.509证书和公共密钥安全连接,来评估服务器的可靠性。
添加固定的SSL证书到你的应用中,帮忙保护中间人攻击和其他弱点。应用处理敏感的用户数据或财务信息,强烈建议所有的通讯通过SSL固定证书并且已经使能的HTTPS链接。
允许无效的SSL证书
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.securityPolicy.allowInvalidCertificates = YES; // not recommended for production
单元测试
AFNetworking在Tests子目录中包含一系列的单元测试。这些单元测试可以很方便的运行,你会喜欢在framework平台上可以执行测试事件。
信用
Alamofire软件基金会拥有和维护AFNetworking。
GowallaiPhone开发部门的Scott Raymond和Mattt Thompson创建了最初的AFNetworking版本。
Alan Defibaugh设计了AFNetworking的图标。
总之,感谢AFNetworking的贡献者.
安全公开
如果你确信你已经鉴定AFNetworking存在安全缺陷,请尽快的发送通过邮件发送到[email protected]. 请不要将它发送为一个公开的问题跟踪。
许可证
AFNetworking遵守MIT许可证。详见LICENSE。
类说明
- AFAutoPurgingImageCache
- AFCompoundResponseSerializer
- AFHTTPRequestSerializer
- AFHTTPResponseSerializer
- AFHTTPSessionManager
- AFImageDownloadReceipt
- AFImageDownloader
- AFImageResponseSerializer
- AFJSONRequestSerializer
- AFJSONResponseSerializer
- AFNetworkActivityIndicatorManager
- AFNetworkReachabilityManager
- AFPropertyListRequestSerializer
- AFSecurityPolicy
- AFURLSessionManager
- AFXMLDocumentResponseSerializer
- AFXMLParserResponseSerializer
协议说明
- AFImageCache
- AFImageRequestCache
- AFMultipartFormData
- AFURLRequestSerialization
- AFURLResponseSerialization
扩展说明
- UIActivityIndicatorView(AFNetworking)
- UIButton(AFNetworking)
- UIImage(AFNetworking)
- UIImageView(AFNetworking)
- UIProgressView(AFNetworking)
- UIRefreshControl(AFNetworking)
- UIWebview(AFNetworking)
常量说明
- AFHTTPRequestQueryStringSerializationStyle
- AFImageDownloadPrioritization
- AFNetworkReachabilityStatus
- AFSSLPinningMode
// END 2017年7月18日 中午