2017-01-11 31 views
1

私たちはクライアントアプリケーションのオフラインフェアプレーコンテンツを構築しています。我々はHLSCatalogデモアプリケーションでAppleサンプルダウンロードマネージャAssetPersistenceManagerクラスを参照することでその機能を実装しました。 一つの機能、そして私はここに強調表示したいバックAssetPersistenceManagerクラスの2回のコールがあり、それはそれはオフラインFairplay AVAssetDownloadTaskは、ダウンロード中に不明なエラーコールバックを取得しました(iOS 10.2でのみ発生しました)

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

最後のストリームのダウンロードが終了だ

/
    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) 
    } 

とコールバックがdidCompleteWithErrorコールバック

あります
func urlSession(_ session: URLSession, task: URLSessionTask, 
didCompleteWithError error: Error?) 

すべてがiOSでうまく動作しているようです。< 10.2、テストを行った後、レイトを実行しているデバイスiOSの10.2 tの唯一の13から15パーセントパーセントを完了している間、アプリはなかれ、didFinishDownloadToデリゲートにコールバックを持っ didCompleteWithError が呼び出され、我々は、プロキシのデバッグアプリでチェックエラー

> "=======> completed percent 11.2888760669556" . 
> "=======> completed percent 11.445666" 
> "=======> 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は、そのバージョン以下、他のOS上でテスト同じストリームがまだ正常に動作している、そのエラーを持っています。 この部分についてのiOS 10.2の変更履歴を見つけようとしましたが、何も見つかりませんでしたか?皆さんに助言がありますか?

答えて

3

私たちは1週間後に答えを見つけました。 10.2の代わりにiOS 10.0-10.1のバグが判明しました。 30代は、DRMエラーに関連した後 エラーが発生し、AVAssetDownloadTaskはAVAssetResourceLoaderDelegateからのコールバックがあります再開された後、それは、iOSの10.2に起こった、あなたがにフェアプレイDRMコンテンツキーを満たすために、サーバーのキーを打つ必要がある

func resourceLoader(_ resourceLoader: AVAssetResourceLoader, 
shouldWaitForLoadingOfRequestedResource loadingRequest: AVAssetResourceLoadingRequest) -> Bool 

そうしないと、ダウンロードが強制的に停止され、上記のような不明なエラーが表示されます。 アップルのサンプルコードHLSCatalogは、非DRMストリームのデモだけであり、デモに必要なコンテンツキーの履行については言及していません。

私たちは、彼らのサンプルを踏襲し、iOSの10.0思えてきた - 10.1を、AVFoundationは処理のダウンロード上のコンテンツキーをチェックしていなかった、それは我々が最初に私たちのダウンロード機能を実装するときにダウンロードする際に、我々はコンテンツ鍵が必​​要とされていないと思った理由ですあなたがiOS 10.2に突入して無駄な一週間にわたって私たちを導いてくれます...

+0

Fairplayを使用することが暗号化されたHLSでAVAssetDownloadTaskを使用するために必須であるかどうか知っていますか?私は 'shouldWaitForLoadingOfRequestedResource'コールバックを実装してローカル暗号化キーを提供していますが、同じエラーが発生します。ストリーミング中は正常に動作しますが、ダウンロードは常に上記のエラーで失敗します。だから私はFairplayを使わないことで問題になるかもしれないと思っていました!または 'shouldWaitForLoadingOfRequestedResource'の中でキー処理の実装を私に提供することができますか?たぶん私はsthを間違っている。 – Alf

+0

「ローカル暗号化キー」を使用する代わりに、サーバーキーを押してshouldWaitForLoadingOfRequestedResourceで新しいキーを取得するようにしてください。ローカルキーとも呼ばれる「永続キー」は、ストリーミングの再ダウンロードや再生には使用できません。 – untouchable

+0

@VadimNikolaevはダウンロードしたオフラインコンテンツを再生しようとしていますか?その場合、以前にダウンロードタスクを開始したときに得たはずの永続キーを要求するためにresourceLoaderが呼び出されました。これは、オフラインでappを使用するために、そのキーをローカルに保存する必要があります(UserDefaultなど) – untouchable

関連する問題