Я использую AVAssetResourceLoadingDelegate
для перехвата всех запросов манифеста для манифеста 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)
В делегате я выполняю все запросы манифеста самостоятельно, используя URLSession
, и возвращаю ответы обратно на AVAssetResourceLoadingRequest
// NOTE: dataRequest: AVAssetResourceLoadingDataRequest
dataRequest.respond(with: data)
loadingRequest.response = response
loadingRequest.finishLoading()
Этот поток защищен с использованием довольно стандартного процесса аутентификации:
Запрос на ведение манифеста выполняется с помощью параметра запроса токена. Ответ на главный манифест включает заголовок set-cookie. Каждый последующий запрос, домен которого указан в заголовке ответа set-cookie, включает cookie в заголовки его запроса.
Я обнаружил, что во всех запросах, сделанных через делегата, cookie добавлен в заголовок, но, поскольку делегат не может быть использован для сегментов TS, cookie не добавляется.
Кто-нибудь знает способ заставить AVURLAsset
всегда использовать заголовок cookie, предоставленный ответом на главный манифест, для запросов, выполненных за пределами AVAssetResourceLoaderDelegate
?
Поскольку я предоставляю URLResponse
обратно на AVAssetResourceLoadingRequest
, и я знаю, что вы можете добавить куки в URLSession, используя свойства httpShouldAccpetCookies
, httpCookieAcceptPolicy
и httpCookieStorage
URLSessionConfiguration. Я не думаю, что это выходит за рамки возможностей.
Мне также известно о AVURLAssetHTTPCookiesKey
, который можно добавить к созданию экземпляра AVURLAasset
, но у меня нет cookie, пока не будет сделан основной запрос манифеста.