You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 06:50:15