#import "ViewController.h" @interface ViewController ()<NSURLSessionDelegate, NSURLSessionDownloadDelegate> @property (weak, nonatomic) IBOutlet UIProgressView *progressView; //进度条 @property(nonatomic, strong) NSURLSessionTask *downLoadTask; //下载任务 @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; /***************** SessionConfiguration会话配置 *****************/ //1. 设置工作模式, 分为3种 //defaultSessionConfiguration: 一般模式, 可以使用缓存的Cache, Cookie, 鉴权 //ephemeralSessionConfiguration: 及时模式, 不使用缓存的Cache, Cookie, 鉴权 //backgroundSessionConfigurationWithIdentifier: 后台模式, 完成上传下载, 需要给一个ID, 用于追踪完成工作的Session是哪一个(当程序切到后台, 这个任务也会继续下载) //一般模式 NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; /***************** URLSession网络设置 *****************/ //2. 创建NSURLSession //粒度低 // NSURLSession *session = [NSURLSession sessionWithConfiguration:config]; //粒度高 NSURLSession *session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]]; //设置mainQueue就能在主线程进行回调非常的方便 /***************** URLRequest网址请求对象 *****************/ NSURL *url = [NSURL URLWithString:@"http://hc25.aipai.com/user/656/20448656/6167672/card/25033081/card.mp4?l=a"]; //3. 创建网址请求对象 NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url]; /***************** 会话任务 *****************/ //4. 根据职能不同Task有三种 // (1)NSURLSessionUploadTask: 上传用的Task, 传完以后不会再下载返回结果 // (2)NSURLSessionDownloadTask: 下载用的Task // (3)NSURLSessionDataTask: 可以上传内容, 上传完成后再进行下载??????? // 创建一个给定的请求下载任务 self.downLoadTask = [session downloadTaskWithRequest:urlRequest]; // 创建一个下载任务来下载给定的网址的内容 // self.downLoadTask = [session downloadTaskWithURL:url]; // 创建 和 恢复数据的下载任务 // self.downLoadTask = [session2 downloadTaskWithResumeData:data]; } #pragma mark 开始下载 - (IBAction)startAction:(UIButton *)sender { //得到task后, 调用resume开始工作 [self.downLoadTask resume]; } #pragma mark 暂停下载 - (IBAction)suspendAction:(UIButton *)sender { [self.downLoadTask suspend]; } #pragma mark 恢复下载 - (IBAction)resumeAction:(UIButton *)sender { [self.downLoadTask resume]; } /***************** NSURLSessionDownloadDelegate代理方法 *****************/ #pragma mark 下载完成后调用的方法 -(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location { NSLog(@"下载存放的临时路径 = %@", location.path); //将下载好的.tmp缓存文件, 存成 NSString *cachesPath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).lastObject; //创建新文件路径 NSString *imagePath = [cachesPath stringByAppendingString:@"/image.mp4"]; //文件管理器 NSFileManager *fileManger = [NSFileManager defaultManager]; //将下载号的缓存文件caches移动到新文件里 [fileManger moveItemAtPath:location.path toPath:imagePath error:nil]; NSLog(@"转存后的路径 = %@", imagePath); } /** * 每下载完一部分文件后就会触发的方法 * * @param session 会话 * @param downloadTask 下载任务 * @param bytesWritten 下载速度 * @param totalBytesWritten 已经下载多少 * @param totalBytesExpectedToWrite 文件总大小 */ -(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite { NSLog(@"速度:%lld kb/s, 已经下载:%lldkb 总大小:%lldkb ", bytesWritten/1024, totalBytesWritten/1024, totalBytesExpectedToWrite/1024); //已经下载 / 总大小 self.progressView.progress = (double)totalBytesWritten/totalBytesExpectedToWrite; }