首先,一些简单的概念这里不多说,想要了解NSURLSession如何简单实现后台下载功能,可以百度会有很多基础的文章可供参考。
我实现的功能类似于优酷里的视频下载,进到后台后可以一个接一个的下载,直到下载完成。
1.创建NSURLSession
创建不同identifier来区分不同的任务,我是根据视频ID来创建不同的任务。(我是在自己封装的下载类里创建下载会话,实现代理的,不是在APPDelegate里)
/** DownloadTools.m **/
/**
返回session
@return session
*/
- (NSURLSession *)backgroundURLSession {
NSURLSession *session = nil;
NSString *identifier = [NSString stringWithFormat:@"ccpcm_%@",_currentFileModel.lessonId];
//创建configuration
NSURLSessionConfiguration* sessionConfig = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:identifier];
//是否允许蜂窝访问
sessionConfig.allowsCellularAccess = NO;
//是否在后台启动app
sessionConfig.sessionSendsLaunchEvents = YES;
session = [NSURLSession sessionWithConfiguration:sessionConfig
delegate:self
delegateQueue:[NSOperationQueue mainQueue]];
return session;
}
DownloadTools.m的下载入口,传进来URL进行下载。
#pragma mark - 创建网络请求会话和任务,并启动任务
-(void)creatDownloadSessionTaskWithURLString:(NSString*)urlString
{
NSURL *url = [NSURL URLWithString:urlString];
self.request = [NSURLRequest requestWithURL:url];
self.session = [self backgroundURLSession];
//这个_isFirst是判断是否自动调起下载功能,具体有什么用下文细说
if (!_isFirst) {
//loadResumeData:这个方法是把我之前存的resumeData从本地取出来,如果本地有,则继续下载,如果本地没有,则从头下载,进而实现断点续传。
self.resumeData = [self loadResumeData:self.currentFileModel.lessonId];
if (self.resumeData == nil) {
self.downloadTask = [self.session downloadTaskWithRequest:self.request];
} else {
self.downloadTask = [self.session downloadTaskWithResumeData:self.resumeData];
}
[self.downloadTask resume];
}
}