Model.h
#import <Foundation/Foundation.h>
/* Rule:
* 第一版本后端目前不支持断点续传
* 第一版产品需求:仅支持单个音频下载
* 用户退到后台后账号被踢,只清除正在下载中的音频文件,不清除已下载的音频
* 用户退到后台后,如果网络断开,取消下载,下次进入需重新下载
*/
typedef NS_ENUM(NSInteger,DownLoadMusicState) {
DownLoadMusicStateNone, // 未开始下载
DownLoadMusicStateResumed, //下载中
DownLoadMusicStateCompleted, //下载完成
DownLoadMusicStateError, //下载失败
};
typedef void(^startDownloadBlock)(DownLoadMusicState state); //开始回调
typedef void(^progressDownloadBlock)(int64_t totalBytesWritten, int64_t totalBytesExpected); //下载进度
typedef void(^finishDownloadBlock)(NSString *url, DownLoadMusicState state); //下载结束
typedef void(^errorDownloadBlock)(NSError *error, DownLoadMusicState state); //下载出错
@interface DownloadMusicModel : NSObject
@property (nonatomic,copy) NSString *localPath; //音频在沙盒中的路径
@property (nonatomic,copy) NSString *musicUrl; //API返回的下载链接
@property (nonatomic,strong) NSError *error; //错误信息
@property (nonatomic,strong) NSString *fileName; //存音频的名称
@property (nonatomic,copy) startDownloadBlock startBlock;
@property (nonatomic,copy) progressDownloadBlock progressBlock;
@property (nonatomic,copy) finishDownloadBlock finishBlock;
@property (nonatomic,copy) errorDownloadBlock errorBlock;
@property (nonatomic,assign) DownLoadMusicState downloadState;
@property (nonatomic,strong) NSURLSessionDownloadTask *downloadTask;
- (void)resume; //开始下载
- (void)suspend; //暂停下载
- (void)cancel; //取消下载
- (void)createTask:(NSURLSession *)session; // 创建task任务
- (void)didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite; //
- (void)didFinishDownloadingToURL:(NSURL *)location;
- (void)didCompleteWithError:(NSError *)error;
- (BOOL)isEsixtLocalPath:(NSString *)musicUrl;
@end
Model.m
@implementation DownloadMusicModel
#pragma mark - public
- (void)resume {
[self.downloadTask resume];
self.downloadState = DownLoadMusicStateResumed;
if (self.startBlock) {
self.startBlock(DownLoadMusicStateResumed);
}
}
- (void)suspend {
[self.downloadTask suspend];
}
- (void)cancel {
[self.downloadTask cancel];
}
- (void)createTask:(NSURLSession *)session {
if (self.downloadTask) {
return;
}
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:self.musicUrl]];
self.downloadTask = [session downloadTaskWithRequest:request];
//设置描述
self.downloadTask.taskDescription = self.musicUrl;
}
- (BOOL)isEsixtLocalPath:(NSString *)musicUrl {
if ([NSString isBlankString:musicUrl]) {