PLVVodDownloadManager
是点播 SDK 中的一个单例类,主要负责视频的下载、下载信息回调和下载队列的管理。下载信息封装在类 PLVVodDownlaodInfo
中,每一个下载任务对应一个 PLVVodDownlaodInfo
对象。
下载器的使用详见 demo 中 PLVDownloadManagerViewController
的实现。
5.1 下载设置
在进行下载之前,我们需要先进行一些设置。
5.1.1 AppDelegate
首先,在 AppDelegate
中,我们需要进行以下配置:
- (void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier
completionHandler:(void (^)(void))completionHandler {
// 处理后台下载完成回调的事件
[[PLVVodDownloadManager sharedManager] handleEventsForBackgroundURLSession:identifier completionHandler:completionHandler];
}
- (void)applicationDidEnterBackground:(UIApplication *)application {
// app 退到后台时进行相关设置
[[PLVVodDownloadManager sharedManager] applicationDidEnterBackground];
}
- (void)applicationWillEnterForeground:(UIApplication *)application {
// app 回到前台时进行相关设置
[[PLVVodDownloadManager sharedManager] applicationWillEnterForeground];
}
- (void)applicationWillTerminate:(UIApplication *)application {
// 程序即将结束时,修改并保存下载中视频的下载状态,用于程序下次启动后,恢复视频下载状态
[[PLVVodDownloadManager sharedManager] applicationWillTerminate];
}
5.1.2 下载器设置
PLVVodDownloadManager
包含以下下载属性,开发者可以根据需要进行设置,也可以保持默认设置。
5.1.2.1 设置下载目录
下载目录默认为沙盒文件夹 "Library/Caches/PolyvVodCache"。注意,修改下载目录后,上一个目录的离线视频将无法索引。修改下载目录可以通过修改 PLVVodDownloadManager
的属性 downloadDir
,也可以通过方法 -setDownloadDir:skipBackup:error:
进行修改。
// 下载目录,默认为 Library/Caches/PolyvVodCache
@property (nonatomic, copy) NSString *downloadDir;
/**
设置下载目录
@param downloadDir 设置的下载目录
@param skipBackup 是否忽略 iCloud 的备份
@param error 错误回调
@return 是否成功
*/
- (BOOL)setDownloadDir:(NSString *)downloadDir skipBackup:(BOOL)skipBackup error:(NSError **)error;
5.1.2.2 是否允许使用蜂窝移动网络进行下载
默认允许,如需禁止使用蜂窝移动网络进行下载,需要修改属性值 allowsCellularAccess
为 NO。
// 是否允许使用蜂窝移动网络进行下载,默认 YES
@property (nonatomic, assign) BOOL allowsCellularAccess;
5.1.2.3 下载最大并发数
PLVVodDownloadManager
的下载并发数通过 maxRuningCount
设置,默认是 1,最大可设为 3。
// 允许同时下载的最大任务数, 默认为1,最大为3
@property (nonatomic, assign) NSUInteger maxRuningCount;
5.2 下载信息模型
PLVVodDownloadInfo
是下载信息模型类,包含如下只读属性:
// 唯一标识
@property (nonatomic, copy, readonly) NSString *identifier;
// 队列ID
@property (nonatomic, assign, readonly) NSInteger downloadId;
// PLVVodVideo 对象
@property (nonatomic, strong, readonly) PLVVodVideo *video;
// vid 便捷属性
@property (nonatomic, copy, readonly) NSString *vid;
// 清晰度
@property (nonatomic, assign, readonly) PLVVodQuality quality;
// 文件类型,默认为视频
@property (nonatomic, assign, readonly) PLVDownloadFileType fileType;
// 下载相关
@property (nonatomic, assign, readonly) PLVVodDownloadState state; // 下载状态
@property (nonatomic, assign, readonly) double bytesPerSeconds; // 下载速率(单位:byte/s)
@property (nonatomic, assign, readonly) double progress; // 下载进度(0-1)
@property (nonatomic, assign, readonly) double unzipProgress; // 解压进度(0-1)
@property (nonatomic, strong, readonly) NSError *error; // 下载错误
// UI展示
@property (nonatomic, copy, readonly) NSString *snapshot; // 封面
@property (nonatomic, copy, readonly) NSString *title; // 视频名称
@property (nonatomic, assign, readonly) NSUInteger filesize; // 文件大小
其中,清晰度的枚举值定义参见点播文档 4.2.1,下载状态、文件类型的枚举定义如下:
// 下载状态
typedef NS_ENUM(NSInteger, PLVVodDownloadState) {
PLVVodDownloadStatePreparing = 0, // 准备,默认值
PLVVodDownloadStatePreparingStart = 7, // 准备中,正在创建任务
PLVVodDownloadStateReady = 1, // 就绪,下载任务已创建
PLVVodDownloadStateRunning = 2, // 正在下载
PLVVodDownloadStateStopping = 3, // 正在停止
PLVVodDownloadStateStopped = 4, // 停止下载
PLVVodDownloadStateSuccess = 5, // 下载成功
PLVVodDownloadStateFailed = 6 // 下载失败
};
// 下载文件类型
typedef NS_ENUM(NSUInteger, PLVDownloadFileType) {
PLVDownloadFileTypeVideo = 1 << 0, // 视频文件
PLVDownloadFileTypeAudio = 1 << 1 // 音频文件
};
5.3 视频下载
5.3.1 新增下载任务
使用方法 -downloadVideo:
将视频对象 PLVVodVideo
添加到下载队列中,如果属性 autoStart
为默认值 NO,那么需要调用方法 -startDownload
启动下载,否则则不需要。相关属性、方法声明如下:
// 添加任务后是否自动启动,默认 NO
@property (nonatomic, assign) BOOL autoStart;
/**
使用后台设置的默认画质添加至下载队列
@param video PLVVodVideo 视频对象
@return 下载信息
*/
- (PLVVodDownloadInfo *)downloadVideo:(PLVVodVideo *)video;
/**
开始队列下载
*/
- (void)startDownload;
/**
停止队列下载
*/
- (void)stopDownload;
添加视频并开始/停止下载代码示例如下:
[[PLVVodDownloadManager sharedManager] downloadVideo:video]; // 将视频 video 添加到下载队列
[[PLVVodDownloadManager sharedManager] startDownload]; // 开始下载
[[PLVVodDownloadManager sharedManager] stopDownload]; // 停止下载
使用如下方法还可以启动、停止指定 vid
的视频:
/**
从指定视频开始下载
@param vid 视频vid
*/
- (void)startDownloadWithVid:(NSString *)vid;
/**
停止下载指定视频
@param vid 视频vid
*/
- (void)stopDownloadWithVid:(NSString *)vid;
5.3.2 移除下载任务
移除下载任务方法声明如下:
/**
移除下载任务,并删除对应文件
@param vid vid
@param error 错误回调
*/
- (void)removeDownloadWithVid:(NSString *)vid error:(NSError **)error;
/**
移除所有下载任务,并删除对应文件,与已完成下载的视频无关
@param completion 删除任务后的回调
*/
- (void)removeAllDownloadWithComplete:(void(^)(void *result))completion;
注意,任务移除之后,对应的视频文件也会被删除。移除所有下载任务不包括已成功下载的。
5.3.3 读取下载任务
使用如下方法,可以获取所有已成功下载的视频信息/本地视频,也可以根据 vid
获取指定的视频下载信息。
/**
获取所有已缓存成功视频信息
@return 下载完成的视频数组
*/
- (NSArray<PLVVodDownloadInfo *> *)requestDownloadCompleteList;
/**
根据vid 获取视频下载信息
@param vid 视频vid
*/
- (PLVVodDownloadInfo *)requestDownloadInfoWithVid:(NSString *)vid;
/**
获取已下载的本地视频
@return 一组 PLVVodLocalVideo 对象
*/
- (NSArray<PLVVodLocalVideo *> *)localVideos;
5.4 下载回调
5.4.1 下载器回调
PLVVodDownloadManager
使用以下回调对视频下载进行监听:
// 完成所有下载回调
@property (nonatomic, copy) void(^completeBlock)(void);
// 单个视频下载完成回调
@property (nonatomic, copy) void(^downloadCompleteBlock)(PLVVodDownloadInfo *info);
// 下载错误回调
@property (nonatomic, copy) void (^downloadErrorHandler)(PLVVodVideo *video, NSError *error);
示例代码如下:
PLVVodDownloadManager *downloadManager = [PLVVodDownloadManager sharedManager];
downloadManager.downloadCompleteBlock = ^(PLVVodDownloadInfo *info) {
NSLog(@"video vid %@ download success", info.vid);
};
downloadManager.downloadErrorHandler = ^(PLVVodVideo *video, NSError *error) {
NSLog(@"video vid %@ download error: %@", video.vid, error);
};
downloadManager.completeBlock = ^{
NSLog(@"all video download success");
};
5.4.2 下载任务回调
每一个视频下载信息对象 PLVVodDownloadInfo
也有自己的回调,开发者通过实现这些回调,可以进行 UI 的更新:
// 下载状态变更回调
@property (nonatomic, copy) void (^stateDidChangeBlock)(PLVVodDownloadInfo *info);
// 下载速率(单位:byte/s)变更回调
@property (nonatomic, copy) void (^bytesPerSecondsDidChangeBlock)(PLVVodDownloadInfo *info);
// 下载进度(0-1)变更回调
@property (nonatomic, copy) void (^progressDidChangeBlock)(PLVVodDownloadInfo *info);
// 解压进度(0-1)变更回调
@property (nonatomic, copy) void (^unzipProgressDidChangeBlock)(PLVVodDownloadInfo *info);