// // BJVDownloadManager+migration.h // BJVideoPlayerCore // // Created by MingLQ on 2018-04-03. // Copyright © 2018 BaijiaYun. All rights reserved. // #import #import "BJVDownloadManager.h" #import "PMDownloadManager.h" NS_ASSUME_NONNULL_BEGIN /** * PMDownloadManager 下载数据迁移 * * 规则: * 未下载完成的任务 - 已下载部分数据只能丢弃,创建新的下载任务重新下载; * 已下载完成的任务 - 已下载文件将被保留,迁移完成后需要通过网络请求获取新下载记录所需的基本信息; * * 步骤: * !!!: 迁移过程需要访问网络,但网络请求可能因各种原始而失败、App 也有可能因各种原因被杀死或崩溃,因此需要设计一个入口、能让用户随时触发迁移,确保迁移成功才关闭入口; * 1. 实现 协议,可根据视频 `videoID` 或 `classID`、`sessionID` 返回相应的 `token`; * 2. App 启动后调用 `+[PMDownloadManager downloadManagerWithRootPath:]` 设置旧的下载根目录,然后调用 `PMDownloadManager.downloadingList` 和 `PMDownloadManager.finishedList` 分别获取下载中和下载完成的任务 - `PMDownloadModel` 的实例; * 3. 如果 `PMDownloadModel.readyForMigration` 是 NO,需要调用 `-[PMDownloadModel prepareForMigrationWithCompletion:]` 完成迁移前准备; * 4. 对每个任务调用 `-[BJLDownloadManager migratePMDownloadModel:code:]` 或 `-[BJLDownloadManager migrateCompletedPMDownloadModel:code:]` 方法进行迁移; * 5. 迁移方法返回的 `downloadItem` 不为 nil、且 code 为 `BJVDownloadMigrationCode_added` 时表示添加成功; * 6. 添加成功后状态为 `suspended`,需要 resume 来补齐视频/回放的基本信息(`autoResume` 设置 YES,或调用 `-[BJVDownloadItem resume]`),此步骤需要联网完成,出错可通过 `BJVDownloadItem.error` 查看,再次调用 `-[BJVDownloadItem resume]` 可重试; * 7. 迁移完成后调用 `-[PMDownloadManager removePMDownloadModel:]` 方法删除旧的下载记录; */ /** 迁移结果状态码 */ typedef NS_ENUM(NSInteger, BJVDownloadMigrationCode) { /** 添加成功,之后会通过网络请求获取新下载记录所需的基本信息 */ BJVDownloadMigrationCode_added = 0, /** PMDownloadModel 或 ID 为空,或相同的下载任务已存在 */ BJVDownloadMigrationCode_ivalidPMDownloadModel, /** PMDownloadModel 未下载完成,需要调用 `migratePMDownloadModel:code:` 进行迁移 - 重新下载 */ BJVDownloadMigrationCode_uncompletedPMDownloadModel, /** 下载文件已丢失,可调用 `migratePMDownloadModel:code:` 进行迁移 - 重新下载 */ BJVDownloadMigrationCode_fileLost, /** PMDownloadModel.readyForMigration 是 NO 时无法迁移,需要先调用 `-[PMDownloadModel prepareForMigrationWithCompletion:]` 且回调成功 */ BJVDownloadMigrationCode_notReadyForMigration, /** 迁移文件出错导致迁移失败,可调用 `migratePMDownloadModel:code:` 进行迁移 - 重新下载 */ BJVDownloadMigrationCode_failedWithError }; @interface BJVDownloadManager (migration) /** 重新下载 * 用于未下载完成、文件损坏、迁移失败的任务 */ - (nullable BJVDownloadItem *)migratePMDownloadModel:(PMDownloadModel *)pmDownloadModel code:(BJVDownloadMigrationCode *)code; // autoResume: YES - (nullable BJVDownloadItem *)migratePMDownloadModel:(PMDownloadModel *)pmDownloadModel code:(BJVDownloadMigrationCode *)code userInfo:(nullable NSDictionary *)userInfo accessKey:(nullable NSString *)accessKey autoResume:(BOOL)autoResume; /** 迁移下载任务 * 用于已下载完成的任务 */ - (nullable BJVDownloadItem *)migrateCompletedPMDownloadModel:(PMDownloadModel *)pmDownloadModel code:(BJVDownloadMigrationCode *)code; // autoResume: YES - (nullable BJVDownloadItem *)migrateCompletedPMDownloadModel:(PMDownloadModel *)pmDownloadModel code:(BJVDownloadMigrationCode *)code userInfo:(nullable NSDictionary *)userInfo accessKey:(nullable NSString *)accessKey autoResume:(BOOL)autoResume; @end NS_ASSUME_NONNULL_END