iOS网络编程————AFNetworking上传和下载

时间:2022-04-07 15:54:24

作为使用最广泛的网络第三方框架,AFNetworking2.0对最新的iOS特性有很好的支持,对NSURL进行了封装,使用更加简便,功能更加完善。


导入AFNetworking

1:Github下载地址:https://github.com/AFNetworking/AFNetworking

2:将AFNetworking和UIKit+AFNetworking拖入当前的工程中,iOS7之后对网络的访问要另加设置,不要忘记开启网络(info.plist中添加App Transport Security Settings,在其下添加Allow Arbitrary Loads并设置其value为YES)


另种方法:在终端利用cocoaPods来将AFNetworking配置到当前工程中

1:终端输入:pod search AFNetworking并拷贝

2:cd到当前工程目录

3:初始化cocoa环境:pod init  (会自动创建Podfile文件)

4:编辑Podfile文件:vim Podfile

5:在终端中输入i,表示插入内容到Podfile

6:在target ‘工程名’ do与end之间写入拷贝的AFNetworking库

7:输入完以后,按下Esc键退出编辑状态,然后输入:wq,保存并退出。

8:在Finder中打开工程目录,在.xcworkspace中进行下面的编辑任务即可。

使用AFNetworking实现基本的下载数据任务

#import "ViewController.h"
#import "AFNetworking.h"
#import "UIProgressView+AFNetworking.h"

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIProgressView *progressView;
@property (weak, nonatomic) IBOutlet UILabel *progressLabel;

@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}

//downloadButton控制下载的方法
- (IBAction)downloadTask:(id)sender {

//记住这个套路!!!

//下载地址
NSString *urlString = @"http://218.76.27.57:8080/chinaschool_rs02/135275/153903/160861/160867/1370744550357.mp3";
//创建请求对象
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]];

//创建会话管理对象(在不使用Configuration来设置时用默认的manager足矣)
AFHTTPSessionManager *sessionManager = [AFHTTPSessionManager manager];

//创建下载任务
NSURLSessionDownloadTask *downloadTask = [sessionManager downloadTaskWithRequest:request progress:^(NSProgress *downloadProgress) {

//progressView和progressLabel同步进度
_progressView.observedProgress = downloadProgress;

NSString *progressString = [NSString stringWithFormat:@"%.1f%%", downloadProgress.completedUnitCount * 1.0 / downloadProgress.totalUnitCount * 100];

[_progressLabel performSelectorOnMainThread:@selector(setText:) withObject:progressString waitUntilDone:YES];


} destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {

//接收到响应,准备开始接受数据
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;

//打印请求状态码
NSLog(@"状态码:%li", httpResponse.statusCode);

//targetPath临时问价保存路径

//返回值为本次下载任务的保存路径
NSString *filePath1 = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/菊花台.mp3"];

//此block返回值为下载完之后文件存放的路径
//这个返回的NSURL后面会传到filePath,因此这里自己设置的filePath可以随意取名
return [NSURL fileURLWithPath:filePath1];


} completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {

//这个block返回的filePath实际上就是我们上面给他的确定的filePath,在这里他提供了这个可查下载文件路径的参数
NSLog(@"下载完成路径:%@", filePath);
}];

//开始任务
[downloadTask resume];

//设置progressView的进度
// [_progressView setProgressWithDownloadProgressOfTask:downloadTask animated:YES];
}


使用AFNetworking实现基础的上传任务(本地上传图片和文字到新浪微博,新浪微博的用户token和发布微博消息的api已拿到)

#import "AFNetworking.h"
#import "UIKit+AFNetworking.h"
#import "UIProgressView+AFNetworking.h"
#import "ViewController.h"

@class AFHTTPSessionManager;

@interface ViewController ()

@property (weak, nonatomic) IBOutlet UIProgressView *progressView;
@property (weak, nonatomic) IBOutlet UITextField *textField;
@property (weak, nonatomic) IBOutlet UILabel *progressLabel;



@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}





- (IBAction)uploadTask:(id)sender {

if (_textField.text.length == 0) {
return;
}

//上传路径
NSString *urlString = @"https://api.weibo.com/2/statuses/upload.json";
//登录认证
NSString *token = @"2.00hd363CtKpsnBedca9b3f35tBYiPD";

//拼接参数列表
NSDictionary *dic = @{@"access_token" : token, @"status" : _textField.text};

//创建manager
AFHTTPSessionManager *sessionManager = [AFHTTPSessionManager manager];

//创建上传方法
NSURLSessionDataTask *dataTask = [sessionManager POST:urlString parameters:dic constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {

//本地文件路径
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"gem" ofType:@"jpeg"];

NSData *imageData = [NSData dataWithContentsOfFile:filePath];

//添加上传的数据
[formData appendPartWithFileData:imageData name:@"pic" fileName:@"gem.jpeg" mimeType:@"image/jpeg"];

//新版本AFNetworking提供了progress的参数
} progress: ^(NSProgress * uploadProgress){


NSLog(@"%@", uploadProgress);

//progressLabel和progressView同步显示进程
NSString *labelString = [NSString stringWithFormat:@"%.1f%%", (CGFloat)uploadProgress.completedUnitCount / uploadProgress.totalUnitCount * 100];

[_progressLabel performSelectorOnMainThread:@selector(setText:) withObject:labelString waitUntilDone:YES];

_progressView.observedProgress = uploadProgress;

}success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {

NSLog(@"上传成功:%@", responseObject);

} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

NSLog(@"上传失败:%@",error);

}];



// [_progressView setProgressWithUploadProgressOfTask:(NSURLSessionUploadTask *)dataTask animated:YES];

}