我目前正在尝试使用tvOS应用程序上的FairPlay流来实现处理DRM的服务。 这是我的工作流程:
我将应用程序证书作为数据
从这个证书中我得到了SPC数据,使用:
resourceLoadingRequest.streamingContentKeyRequestData(forApp: applicationCertificate, contentIdentifier: assetIDData, options: resourceLoadingRequestOptions)
从编码为base64Data的SPC数据中,我在服务器上请求POST(在有效负载中使用SPC)以获取给我CKD数据的许可证
然后,当我获得CKC数据时,我使用它们如下:
guard let dataRequest = resourceLoadingRequest.dataRequest else {
print("no data is being requested in loadingRequest")
let error = NSError(domain: AssetLoaderDelegate.errorDomain, code: -6, userInfo: nil)
resourceLoadingRequest.finishLoading(with: error)
return
}
dataRequest.respond(with: datas)
resourceLoadingRequest.finishLoading()
但是在这些步骤之后我得到了错误:
错误域= AVFoundationErrorDomain代码= -11835“无法打开” UserInfo = {NSUnderlyingError = 0x170440de0 {错误 Domain = NSOSStatusErrorDomain Code = -42681“(null)”}, NSLocalizedFailureReason =此内容未经授权。, NSLocalizedDescription =无法打开}
有没有人有想法或提示?
其他信息:
播放过程适用于未受保护的内容。
playerItem.errorLog()返回nil。
playerItem.status == .failed返回true。
所有服务器端进程似乎都没问题,因为它已经用于网站和智能电视。
答案 0 :(得分:1)
我最近遇到了这个完全相同的问题。问题是从streamingContentKeyRequestData(forApp...
返回的CKC响应数据不仅是数据,而且是以64为基数的字符串数据。您需要做的就是在响应数据请求之前对其进行解码:
dataRequest.respond(with: Data(base64Encoded: datas)!)
对于生产代码,您将需要正确处理可选性。希望这可以帮助!