iOS 16 FairPlay 变更

3

在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)"}}

这可能是什么原因,有什么解决方案呢?

提前致谢。

4个回答

1

我们正在使用 AVContentKeySession 进行下载,遇到了相同的错误并对其进行了修复。 对于我们的情况,问题如下。

观察到的问题:

  1. 在 iOS16.0.3 上,在应用程序首次触发“许可证请求”后12秒,“许可证请求”将再次由 AVFoundation 框架触发 ("contentKeySession(_ session: AVContentKeySession, didProvide keyRequest: AVContentKeyRequest)" 再次被调用),然后快速地通过框架报告错误 “-19152“。 错误日志: contentKeySession(_:contentKeyRequest:didFailWithError:),行:XXX, 消息:XXX,URL:XXX,错误为 Domain=CoreMediaErrorDomain Code=-19152 "(null)"
  2. 在 iOS15.6.1 上,在应用程序下载期间触发“许可证请求”后,框架不会再触发任何“许可证请求”。

根本原因: iOS Framework API(AVContentKeySession 和 AVPersistableContentKeyRequest)在 iOS16 上的行为发生了变化。

解决方案: 在iOS16+版本中,CKC下载之后添加“keyRequest.processContentKeyResponse(keyResponse)”

  • 在iOS11到iOS15版本中,我们没有在下载后调用它,而是仅在本地保存persistentKeyData,并在播放时调用processContentKeyResponse。这在这些iOS版本上始终运行良好。
  • 但是,在iOS16及以上版本(直到目前为止的iOS16.1 Beta4),旧版流程会触发框架错误。因此我们添加了此修复。

0

根据文档iOS 15上函数streamingContentKeyRequestDataForApp已被弃用。请使用在新函数文档中指定的makeStreamingContentKeyRequestData函数。以下是一个示例用法:

func makeStreamingContentKeyRequestData(
    forApp appIdentifier: Data,
    contentIdentifier: Data?,
    options: [String : Any]? = nil,
    completionHandler handler: @escaping (Data?, Error?) -> Void
)

如我在问题中已经提到的那样,我目前仅使用makeStreamingContentKeyRequestData。 - harshit mishra
在你的问题中提到了 makeStreamingContentKeyRequestDataForApp,而不是 makeStreamingContentKeyRequestData - Mr.SwiftOak

0
我遇到的问题是keyRequest.options没有被设置,因为它在iOS 16中显示为空(出于某种奇怪的原因)。
我正在向processContentKeyRequest(withIdentifer identifier: Any?, initializationData: Data?, options: [String : Any]? = nil)传递正确的选项。
但在ContentKeyDelegate函数中,它们显示不同。所以,我的解决方法就是使用全局选项字典来存储许可证URL和资产数据。您可以使用任何您喜欢的存储方法。

-2

我已经解决了这个问题,问题出在m3u8文件中有重复的EXT标签,这在iOS 15中可以工作,因为它从第一个标签中获取信息,而在iOS 16中它使用了所有标签并导致错误。


你好,我也遇到了同样的问题。你是因为哪些具体的HLS EXT标签出了问题呢?非常感谢你的帮助! - warchimede
请提供更多细节,说明问题所在。 M3U8中的所有标签都以#EXT开头,因此解释并没有提供有关特定标签(以及它们的哪些方面)引起问题的详细信息。 - theRealRobG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接