J'utilise le AVAssetResourceLoadingDelegate
pour intercepter toutes les demandes de manifeste pour un manifeste HLS
let str = "examplehttp://example.com/path/to/master.m3u8?token=SOMETOKEN"
guard let url = URL(string: str) else { return }
let asset = AVURLAsset(url: url)
let loaderQueue = DispatchQueue(label: "com.example.LoaderQueue")
asset.resourceLoader.setDelegate(delegate, queue: loaderQueue)
let item = AVPlayerItem(asset: asset)
player = AVPlayer(playerItem: item)
player?.playImmediately(atRate: 1.0)
Dans le délégué, j'effectue moi-même toutes les demandes de manifeste en utilisant URLSession
et renvoie les réponses au AVAssetResourceLoadingRequest
// NOTE: dataRequest: AVAssetResourceLoadingDataRequest
dataRequest.respond(with: data)
loadingRequest.response = response
loadingRequest.finishLoading()
Ce flux est protégé par un processus d'authentification relativement standard :
La demande de manifeste principal est faite avec un paramètre de requête de jeton annexé. La réponse au manifeste principal comprend un en-tête set-cookie. Chaque demande ultérieure dont le domaine est spécifié dans l'en-tête de réponse set-cookie inclut le cookie dans ses en-têtes de demande.
Ce que je constate, c'est que toutes les demandes faites par l'intermédiaire du délégué ont le cookie ajouté à l'en-tête, mais comme le délégué ne peut pas être utilisé pour les segments TS, le cookie n'est pas ajouté.
Quelqu'un connaît-il un moyen de forcer le AVURLAsset
pour toujours utiliser l'en-tête de cookie fourni par la réponse au manifeste principal pour les requêtes effectuées en dehors de l'environnement AVAssetResourceLoaderDelegate
?
Puisque je fournis le URLResponse
retour à AVAssetResourceLoadingRequest
et je sais qu'il est possible d'ajouter des cookies à une URLSession en utilisant la fonction httpShouldAccpetCookies
, httpCookieAcceptPolicy
y httpCookieStorage
propriétés. Je ne pense pas que cela soit hors du champ des possibilités.
Je suis également conscient de la AVURLAssetHTTPCookiesKey
qui peuvent être ajoutées à l'instanciation de l'élément AVURLAasset
mais je n'ai pas le cookie tant qu'une demande de manifeste principal n'a pas été faite.