Использование HLS с Fairplay в собственном приложении iOS (через AVAssetResourceLoaderDelegate) - PullRequest
0 голосов
/ 10 января 2020

Один из моих любимых потоков телевизионных каналов транслируется в Интернете через HLS с FairPlay DRM. Хотя это очень хорошо работает в браузере, их приложение iOS очень хреново. На самом деле это просто гигантский веб-вид, оборачивающий их сайт, и, что еще хуже, он даже не поддерживает фоновый режим, что делает его абсолютно бесполезным.

Так что я решил написать собственный клиент на Swift только для личного использования. .

Что делает браузер

Копание кода Javascript (которое опирается на video js -contrib-eme ) это то, что делает браузер:

  1. извлекает сертификат из URL сертификата (через GET)
  2. при событии webkitkeymessage, отправляет сообщение SPC на URL лицензии (через POST)
  3. ответ с status 200 содержит CKC данные
  4. видео успешно расшифровано и воспроизведено, счастье!

In iOS

В соответствии с примером, включенным в FairPlay Streaming Server SDK v4.2.0 , я соответствовал протоколу AVAssetResourceLoaderDelegate и реализовал resourceLoader:shouldWaitForLoadingOfRequestedResource: следующим образом:

  1. создать Data представление сертификата
  2. создать UTF-8 кодированный Data представление известного String идентификатора содержимого (т.е. "insert-content-identifier-here".data(using: .utf8)!)
  3. создать мои SPC данные, вызвав let spcData = try! loadingRequest.streamingContentKeyRequestData(forApp: certificateData, contentIdentifier: contentIdentifierData, options: nil)

Однако, когда POST в тот же URL-адрес лицензии , используемый браузером (через URLSessionDataTask). Я всегда получаю 500 ошибку сервера вместо правильного CKC сообщения (в теле сообщения указано UNGRANTED_REQUEST)

В основном я следовал тому, что описано в этом фрагменте Github , но безрезультатно.

Возможно ли, что этот сертификат действителен только для браузеров и что в отдельной спецификации c требуется сертификат для нативных приложений?

...