HLS FairPlay同会话删除受保护下载内容后无法重新下载问题
HLS FairPlay 同会话重下载无密钥请求问题解决
问题根源
AVContentKeySession 内部会缓存密钥请求状态、已处理的标识符,未清理的AVAssetDownloadTask或旧AVURLAsset实例会持有资源引用,导致删除文件后重新下载时跳过密钥请求流程。
解决方案
1. 彻底清理下载任务与会话缓存
- 删除文件前,先取消并终结目标内容对应的
AVAssetDownloadTask,确保任务完全释放:downloadTask?.cancel() downloadTask = nil - 清理完movpkg和.keys文件后,移除会话内关联的密钥请求标识符:
contentKeySession.removeContentKeyRequest(withIdentifier: targetContentIdentifier)
2. 重置AVContentKeySession状态
仅调用invalidatePersistableContentKey无法清理会话内的请求状态缓存,需彻底重置会话:
contentKeySession.invalidateAndCancelAllRequests() // 重新初始化会话(单例模式下替换实例) contentKeySession = AVContentKeySession(keySystem: .fairPlayStreaming) contentKeySession.setDelegate(self, queue: DispatchQueue.main)
3. 创建新的AVURLAsset实例
重新下载时不要复用旧的AVURLAsset,必须创建新实例加载HLS资源,避免旧实例的缓存状态干扰:
let freshAsset = AVURLAsset(url: hlsStreamURL) // 基于新实例创建下载任务并启动流程
4. 验证密钥目录清理完整性
删除.keys文件夹内容后,打印目录文件列表确认无残留:
do { let keyFiles = try FileManager.default.contentsOfDirectory(atPath: keysDirectoryPath) print("剩余密钥文件:\(keyFiles)") } catch { print("读取密钥目录失败:\(error)") }
内容的提问来源于stack exchange,提问作者alessandro_minopoli
相关产品推荐
相关产品推荐

