Один из моих любимых потоков телевизионных каналов транслируется в Интернете через HLS с FairPlay DRM. Хотя это очень хорошо работает в браузере, их приложение iOS очень хреново. На самом деле это просто гигантский веб-вид, оборачивающий их сайт, и, что еще хуже, он даже не поддерживает фоновый режим, что делает его абсолютно бесполезным.
Так что я решил написать собственный клиент на Swift только для личного использования. .
Что делает браузер
Копание кода Javascript (которое опирается на video js -contrib-eme ) это то, что делает браузер:
- извлекает сертификат из URL сертификата (через
GET
) - при событии
webkitkeymessage
, отправляет сообщение SPC
на URL лицензии (через POST
) - ответ с
status 200
содержит CKC
данные - видео успешно расшифровано и воспроизведено, счастье!
In iOS
В соответствии с примером, включенным в FairPlay Streaming Server SDK v4.2.0 , я соответствовал протоколу AVAssetResourceLoaderDelegate
и реализовал resourceLoader:shouldWaitForLoadingOfRequestedResource:
следующим образом:
- создать
Data
представление сертификата - создать
UTF-8
кодированный Data
представление известного String
идентификатора содержимого (т.е. "insert-content-identifier-here".data(using: .utf8)!
) - создать мои
SPC
данные, вызвав let spcData = try! loadingRequest.streamingContentKeyRequestData(forApp: certificateData, contentIdentifier: contentIdentifierData, options: nil)
Однако, когда POST
в тот же URL-адрес лицензии , используемый браузером (через
URLSessionDataTask
). Я всегда получаю 500
ошибку сервера вместо правильного CKC
сообщения (в теле сообщения указано UNGRANTED_REQUEST
)
В основном я следовал тому, что описано в этом фрагменте Github , но безрезультатно.
Возможно ли, что этот сертификат действителен только для браузеров и что в отдельной спецификации c требуется сертификат для нативных приложений?