iOS 杂谈iOS 网络编程AFNetworking文档

AFNetworking说明书

2017-02-06  本文已影响488人  _阿南_
图片来之网络

AFNetworking是为iOS和Mac OS X系统提供的一个简单方便的网络库。它是建立在基础URL加载系统,扩展为非常高级的网络抽象,成为Cocoa的组成部分。它有一个设计完美的模块化架构,有个很多方便使用并功能多样的接口。也许最重要的特色,无论如何,应该是为每天使用AFNetworking或给AFNetworking提供帮助的开发者提供令人惊喜的社区。AFNetworking在iPhone,iPad和Mac上被一些最受欢迎和受人好评的应用使用。
在你的下一个项目或移植你的当前项目选择使用AFNetworking,你将会非常高兴你现在的选择。

怎么开始

交流

安装

在工程中使用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

序列化

<AFURLRequestSerialization>

<AFURLResponseSerialization>

额外方法

使用

AFURLSessionManager

AFURLSessionManager创建和管理一个在NSURLSeesionConfigutarion对象基础上的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

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网络是否可达。

共享的网络可达性

[[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 RaymondMattt Thompson创建了最初的AFNetworking版本。
Alan Defibaugh设计了AFNetworking的图标。
总之,感谢AFNetworking的贡献者.

安全公开

如果你确信你已经鉴定AFNetworking存在安全缺陷,请尽快的发送通过邮件发送到security@alamofire.org. 请不要将它发送为一个公开的问题跟踪。

许可证

AFNetworking遵守MIT许可证。详见LICENSE。


类说明


协议说明


扩展说明


常量说明


// END 2017年7月18日 中午

上一篇下一篇

猜你喜欢

热点阅读