ios - 离线 Fairplay AVAssetDownloadTask 在下载时收到未知错误回调(仅发生在 iOS 10.2 上)

标签 ios swift fairplay avassetdownloadtask

我们正在为我们的客户端应用构建离线公平竞赛内容;我们通过引用 HLSCatalog 演示应用程序中的 Apple 示例下载管理器 AssetPersistenceManager 类来实现该功能。 我想在这里强调一下 AssetPersistenceManager 类中有一个函数和两个回调,它是

    /
    func downloadStream(for asset: Asset) {
        /
         For the initial download, we ask the URLSession for an AVAssetDownloadTask
         with a minimum bitrate corresponding with one of the lower bitrate variants
         in the asset.
         */
        guard let task = assetDownloadURLSession.makeAssetDownloadTask(asset: asset.urlAsset, assetTitle: asset.name, assetArtworkData: nil, options: [AVAssetDownloadTaskMinimumRequiredMediaBitrateKey: 265000]) else { return }

        /
        task.taskDescription = asset.name

        activeDownloadsMap[task] = asset

        task.resume()

        var userInfo = [String: Any]()
        userInfo[Asset.Keys.name] = asset.name
        userInfo[Asset.Keys.downloadState] = Asset.DownloadState.downloading.rawValue

        NotificationCenter.default.post(name: AssetDownloadStateChangedNotification, object: nil, userInfo:  userInfo)
    }

下载完成后回调

func urlSession(_ session: URLSession, assetDownloadTask: AVAssetDownloadTask, didFinishDownloadingTo location: URL) {
    let userDefaults = UserDefaults.standard

    /
     This delegate callback should only be used to save the location URL
     somewhere in your application. Any additional work should be done in
     `URLSessionTaskDelegate.urlSession(_:task:didCompleteWithError:)`.
     */
    if let asset = activeDownloadsMap[assetDownloadTask] {

        userDefaults.set(location.relativePath, forKey: asset.name)
    }
}

最后是didCompleteWithError回调

func urlSession(_ session: URLSession, task: URLSessionTask,
didCompleteWithError error: Error?)

在 iOS < 10.2 上似乎一切正常,但在运行最新 iOS 10.2 的某些设备上进行测试后,应用程序总是收到 didFinishDownloadTo 委托(delegate)的回调,而只有 13-15% 完成了百分比,之后 完成但有错误 被调用,我们收到以下错误

> "=======> completed percent 11.2888760669556" .
> "=======> completed percent 11.44566601233" 
> "=======> completed percent 11.7592459030787"
> "=======> completed percent 12.0728257938275" 
> "=======> completed percent 12.5431956299506" 
> "=======> completed percent 13.0135654660738" 
> "=======> completed percent 13.3271453568226" 
> "=======> completed percent 13.6407252475713" 
> "=======> completed percent 13.9543051383201" 
> "=======> completed percent 14.1110950836945" 
> "=======> completed percent 14.2678850290689" 
> "Error Domain=AVFoundationErrorDomain Code=-11800 \"The operation could not
> be completed\" UserInfo={NSLocalizedDescription=The operation could
> not be completed, NSLocalizedFailureReason=An unknown error occurred
> (-12667)}"

检查代理调试应用程序,它指出应用程序在整个接收响应之前关闭了连接。

Status
Complete
Failure
Client closed connection before receiving entire response
Response Code
206 Partial Content

只有 iOS 10.2 存在该错误,在低于该版本的其他操作系统上测试的相同流仍然工作正常。 试图找到一些关于这部分的 iOS 10.2 变更日志,但我什么也没找到?大家有什么建议吗?

最佳答案

经过一周的坚持,我们自己找到了答案。事实证明,这是 iOS 10.0 - 10.1 上的错误,而不是 10.2 上的错误。 30秒后发生的错误与DRM错误有关,发生在iOS 10.2上,恢复AVAssetDownloadTask后,有来自AVAssetResourceLoaderDelegate的回调,您需要点击服务器 key 来满足

中的Fairplay DRM内容 key
func resourceLoader(_ resourceLoader: AVAssetResourceLoader, 
shouldWaitForLoadingOfRequestedResource loadingRequest: AVAssetResourceLoadingRequest) -> Bool

否则,下载将被迫停止,并且您将收到如上所述的未知错误。 Apple示例代码HLSCatalog只是非DRM流的演示,他们甚至没有提及演示中所需的内容 key 实现。

我们遵循了他们的示例,似乎在 iOS 10.0 - 10.1 中,AVFoundation 在处理下载时没有检查内容 key ,这就是为什么当我们第一次实现下载功能时,我们认为下载时不需要内容 key ,这导致我们浪费了一周时间停留在 iOS 10.2 上...

关于ios - 离线 Fairplay AVAssetDownloadTask 在下载时收到未知错误回调(仅发生在 iOS 10.2 上),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41582668/

相关文章:

ios - Spritekit 场景内容被放大

ios - 如何防止tableview section head在滚动时粘住?

encoding - SDK 使用 FairPlay DRM 对媒体进行编码?

avplayer - Fairplay 播放不工作

ios - Google Chrome Cast iOS SDK 是否支持 Fairplay 和 AES 加密

ios - 如何以编程方式创建 UIView,使其不与状态栏重叠

ios - swift 盾 : Obfuscation using SwiftShield gives error

ios - 如何在 xcode 7、iOS swift 2 中截取 View 的部分屏幕截图?

swift - 在 Firebase 中将 observe 转换为 observeSingleEvent 时出错

ios - 如何在播放实况照片时禁用触觉反馈