FairPlay逻辑是否有任何更改?我的应用程序有FairPlay保护的视频和音频,它们在iOS 15.7之前都能完美工作,但在iOS 16 中
makeStreamingContentKeyRequestData is throwing me following error :
Error Domain=CoreMediaErrorDomain Code=-19152 "(null)"
Error Domain=AVFoundationErrorDomain Code=-11800 "The operation could not be completed"
UserInfo={NSLocalizedFailureReason=An unknown error occurred (-19156), NSLocalizedDescription=The operation could not be completed,
NSUnderlyingError=0x280deac10 {Error Domain=NSOSStatusErrorDomain Code=-19156 "(null)"}}
可能的原因和解决方案是什么?
提前感谢
我们使用AVContentKeySession
进行下载,遇到了同样的错误,并进行了修复。对于我们的案例,问题如下。
观察到的问题:
- 在iOS16.0.3上;许可证请求";在下载过程中首先由应用程序触发;许可证请求";将由AVFoundation框架再次触发(再次调用
"contentKeySession(_ session: AVContentKeySession, didProvide keyRequest: AVContentKeyRequest)"
(,然后框架快速报告错误“-19152“
。错误日志:contentKeySession(_:contentKeyRequest:didFailWithError:(,行:XXX,message:XXX,url:XXX,错误为Domain=CoreMediaErrorDomain代码=-19152";(null("> - 在iOS15.6.上;许可证请求";被触发通过应用程序在下载过程中,框架不会触发任何";许可证请求";再次
根本原因:iOS框架API(AVContentKeySession和AVPersistableContentKeyRequest(行为在iOS16上更改。
解决方案:在iOS16+上下载CKC后添加“keyRequest.processContentKeyResponse(keyResponse)”
。
- 在iOS11-iOS15上,我们下载后没有调用它,而是只在本地保存persistentKeyData,并在播放时调用processContentKeyResponse。这在这些iOS版本上一直运行良好
- 但在iOS16及以上版本(直到iOS16.1 Beta4(上,旧流程会触发框架错误。所以我们添加了这个修复程序
根据文档,函数streamingContentKeyRequestDataForApp
在iOS 15上已弃用。使用新功能文档中指定的功能makeStreamingContentKeyRequestData
。下面是一个用法示例:
func makeStreamingContentKeyRequestData(
forApp appIdentifier: Data,
contentIdentifier: Data?,
options: [String : Any]? = nil,
completionHandler handler: @escaping (Data?, Error?) -> Void
)
我遇到的问题是keyRequest.options
没有设置,因为它显示为零(在iOS 16中,无论出于什么奇怪的原因(。
我正在将正确的选项传递给processContentKeyRequest(withIdentifer identifier: Any?, initializationData: Data?, options: [String : Any]? = nil)
。
但在ContentKeyDelegate函数中,它们显示的是其他情况。因此,我的解决方法只是使用全局选项字典来存储许可证URL和资产数据。您可以使用任何您喜欢的存储方法。
我已经解决了这个问题,这个问题是m3u8文件中有重复的EXT标签,它在iOS 15中工作,因为它从第一个标签中提取了信息,而在iOS 16中,它使用了所有标签并导致错误