1

AVContentSessionKey を使用する FairPlay Streaming Server SDK v4.0.1 のデモに従って、HLS Fairplay で Offline Playback を実装しています。3 つのコンテンツをダウンロードします。各コンテンツはダウンロードされ、ドキュメント ディレクトリの .movpkg とそのコンテンツ キーの両方が正しく保存されます。WIFI をオフにすると、ダウンロードされたこれらの 3 つのコンテンツは問題なく正しく再生され、次のコードを使用して再生されます。

let urlAsset = element.urlAsset!
ContentKeyManager.shared.contentKeySession.addContentKeyRecipient(urlAsset)
if !urlAsset.resourceLoader.preloadsEligibleContentKeys {
  urlAsset.resourceLoader.preloadsEligibleContentKeys = true
}

self.present(playerViewController, animated: true, completion: {
  AssetPlaybackManager.sharedManager.setAssetForPlayback(urlAsset)
})

ここまでは順調ですね。しかし、問題は、アプリケーションを閉じて (アプリケーションを閉じるためのホーム ボタン)、ダウンロードしたコンテンツを再生すると、最後にダウンロードされたコンテンツのみが正しく再生され、他のコンテンツ (1 番目と 2 番目) はこれらのエラーをコンソールに送信することです。

Error Domain=AVFoundationErrorDomain Code=-11800 "The operation could not be completed"
UserInfo={NSUnderlyingError=0x1c065d760 {Error Domain=NSOSStatusErrorDomain Code=-16227 "(null)"},
NSLocalizedFailureReason=An unknown error occurred (-16227),
NSURL=file:///private/var/mobile/Containers/Data/Application/A950D8DB-B711-47E3-AAF5-C95CC9682430/Library/com.apple.UserManagedAssets.kkG8Ih/644986_7798B8476A473F68.movpkg/, NSLocalizedDescription=The operation could not be completed}

ドキュメントディレクトリのキーで .movpkg を再確認すると、正しく表示されます

/Documents/.keys/one-key
/Documents/.keys/two-key
/Documents/.keys/three-key

エラーが発生する前に ContentKeyDelegate が呼び出され、キーが読み込まれてリクエストに正しく渡されます。

if persistableContentKeyExistsOnDisk(withContentKeyIdentifier: assetIDString) {

    let urlToPersistableKey = urlForPersistableContentKey(withContentKeyIdentifier: assetIDString)

    guard let contentKey = FileManager.default.contents(atPath: urlToPersistableKey.path) else {
        /

        pendingPersistableContentKeyIdentifiers.remove(assetIDString)
        return
    }

    /
    Create an AVContentKeyResponse from the persistent key data to use for requesting a key for
    decrypting content.
    */
    let keyResponse = AVContentKeyResponse(fairPlayStreamingKeyResponseData: contentKey)

    /
    keyRequest.processContentKeyResponse(keyResponse)

    return
}

contentKeyRecipients を印刷すると、3 つのコンテンツが正しく表示されます

 - (lldb) po
   ContentKeyManager.shared.contentKeySession.contentKeyRecipients ▿ 3
   elements
   - 0 : AVURLAsset: 0x1c0234d40, URL = file:///private/var/mobile/Containers/Data/Application/E791A4DE-4261-46B7-A84D-D10B27035FAE/Library/com.apple.UserManagedAssets.kkG8Ih/539628_20469336224AA388.movpkg
   - 1 : AVURLAsset: 0x1c0234fa0, URL = file:///private/var/mobile/Containers/Data/Application/E791A4DE-4261-46B7-A84D-D10B27035FAE/Library/com.apple.UserManagedAssets.kkG8Ih/644986_7798B8476A473F68.movpkg
   - 2 : AVURLAsset: 0x1c42391c0, URL = file:///private/var/mobile/Containers/Data/Application/E791A4DE-4261-46B7-A84D-D10B27035FAE/Library/com.apple.UserManagedAssets.kkG8Ih/573744_62377F9549C45B93.movpkg

私のテストは iOS 11.1.2 と iOS 11.2 beta 2 にあります

何が起こっているのかわかりませんが、永続化されたキーに問題があるようです。各コンテンツを一度に 1 つの AVContentKeySession に関連付ける必要があるかどうかはわかりません。

誰かが同様の問題に直面した場合は、助けていただければ幸いです。

前もって感謝します

4

4 に答える 4