AFNetworking是iOS和Mac OS X的令人愉快的网络库。它建立在基础URL加载系统的顶部,将强大的高级网络抽象扩展到Cocoa中。它具有模块化架构,设计精良,功能丰富的API,使用起来非常舒适。
无论如何,所有这一切最重要的特征也许是每天使用和贡献AFNetworking的惊人的开发者社区。AFNetworking为iPhone,iPad和Mac上的一些最受欢迎和最受欢迎的应用程序提供支持。
选择AFNetworking为您的下一个项目,或迁移您现有的项目 - 你会很高兴你所做的!
如何开始
下载 AFNetworking and try out the included Mac and iPhone example apps
看一下 "Getting Started" 指导, FAQ, or 其他的文章在 Wiki
查看 文档 以全面了解AFNetworking中可用的所有API
阅读AFNetworking 3.0迁移指南,了解从2.0开始的架构更改的概述。
沟通方式
- 如需帮助,请移步Stack Overflow(Tag'afnetworking')
- 或问一个问题,还是楼上方法
- 如果您发现了一个bug,并且可以提供可靠再现的步骤,请打开一个issue。
- 如果您有功能请求,请打开issue。
- 如果您想贡献,请提交拉动请求。
安装
AFNetworking支持在项目中安装库的多种方法。
使用CocoaPods安装
CocoaPods 是一个Objective-C的依赖管理器。它可以自动化并简化在项目中使用AFNetworking这样的第三方库的过程。看一下 "Getting Started" guide for more information,您可以使用以下命令安装它
$ gem install cocoapods
注意:需要CocoaPods 0.39.0+来构建AFNetworking 3.0.0+。
Podfile
使用CocoaPods将AFNetworking整合到你的工程中去,在你的Podfile中指定它。
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'
target 'TargetName' do
pod 'AFNetworking', '~> 3.0'
end
然后运行一下命令:
$ pod install
使用 Carthage 安装
Carthage是一个分散的依赖管理器,可以构建您的依赖关系并为您提供二进制框架。
您可以使用以下命令安装Carthage与Homebrew
$ brew update
$ brew install carthage
使用Carthage将AFNetworking整合到你的项目中,在Cartfile中指定它:
github "AFNetworking/AFNetworking" ~> 3.0
运行carthage构建框架,并将内置的AFNetworking.framework拖到Xcode项目中。
配置要求
AFNetworking Version | Minimum iOS Target | Minimum OS X Target | Minimum watchOS Target | Minimum tvOS Target | Notes |
---|---|---|---|---|---|
3.x | iOS 7 | OS X 10.9 | watchOS 2.0 | tvOS 9.0 | Xcode 7+ is required. NSURLConnectionOperation support has been removed. |
2.6 -> 2.6.3 | iOS 7 | OS X 10.9 | watchOS 2.0 | n/a | Xcode 7+ is required. |
2.0 -> 2.5.4 | iOS 6 | OS X 10.8 | n/a | n/a | Xcode 5+ is required. NSURLSession subspec requires iOS 7 or OS X 10.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运行时)
在Swift编程? 尝试一个更传统的API集合的Alamofire。
架构
NSURLSession
- AFURLSessionManager
- AFHTTPSessionManager
Serialization
-
< AFURLRequestSerialization >
- AFHTTPRequestSerializer
- AFJSONRequestSerializer
- AFPropertyListRequestSerializer
-
< AFURLResponseSerialization >
- AFHTTPResponseSerializer
- AFJSONResponseSerializer
- AFXMLParserResponseSerializer
- AFXMLDocumentResponseSerializer (Mac OS X)
- AFPropertyListResponseSerializer
- AFImageResponseSerializer
- AFCompoundResponseSerializer
-
Additional Functionality
- AFSecurityPolicy
- AFNetworkReachabilityManager
用法
AFURLSessionManager
AFURLSessionManager基于指定的NSURLSessionConfiguration对象创建和管理NSURLSession对象,该对象符合<NSURLSessionTaskDelegate>,<NSURLSessionDataDelegate>,<NSURLSessionDownloadDelegate>和<NSURLSessionDelegate>。
- 创建一个下载任务
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<AFMultipartFormData> 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
- 网址格式参数编码
[[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监控域的可达性,以及WWAN和WiFi网络接口的地址。
- 不要使用可达性来确定是否应该发送原始请求。
- 你应该尝试发送它。
- 您可以使用可达性来确定何时应自动重试请求。
- 虽然它可能仍然失败,但可访问性通知连接可用是适时重试某些东西。
- 网络可达性是确定请求可能失败的原因的有用工具。
- 在网络请求失败之后,告诉他们离线的用户比给予他们一个更为技术性但准确的错误,比如“请求超时”。
也可以看看WWDC 2012 session 706, "Networking Best Practices.".
共享网络可连接性
[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
NSLog(@"Reachability: %@", AFStringFromNetworkReachabilityStatus(status));
}];
[[AFNetworkReachabilityManager sharedManager] startMonitoring];
安全政策
AFNetworking在Tests子目录中包含一套单元测试。 这些测试可以简单地执行您想要测试的平台框架上的测试操作。
信用
AFNetworking由Alamofire软件基金会拥有和维护。
AFNetworking最初由Scott Raymond和Mattt Thompson在Gowalla for iPhone的开发中创建。
AFNetworking标志是由Alan Defibaugh设计的。
最重要的是,感谢AFNetworking越来越多的贡献者。
安全披露
如果您认为已经使用AFNetworking确定了安全漏洞,则应尽快通过电子邮件将其报告给security@alamofire.org。 请不要将其发布到公共问题跟踪器。
许可
AFNetworking是根据MIT许可证发布的。 有关详细信息,请参阅许可证。
原文地址:https://github.com/AFNetworking/AFNetworking
欢迎大家围观,如有不足请多指点,谢谢