Как позволить AVPlayer получить список воспроизведения, защищенный SSL? - PullRequest
8 голосов
/ 25 января 2012

Мы разрабатываем приложение iOS для потоковой передачи HTTP, которое требует от нас получения списков воспроизведения с защищенного сайта. Этот сайт требует от нас аутентификации с использованием самозаверяющего SSL-сертификата.

Мы читаем учетные данные из файла .p12, прежде чем использовать NSURLConnection с делегатом для реагирования на запрос авторизации.

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
    [[challenge sender] useCredential:  self.credentials forAuthenticationChallenge:challenge];
}

- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace
{
    return YES;
}

Установив это первоначальное соединение с URL-адресом, по которому мы получаем список воспроизведения .m3u8, мы можем воспроизвести список воспроизведения с помощью AVPlayer. Проблема в том, что этот метод работает только в симуляторе.

ПРИМЕЧАНИЕ. Мы можем загрузить список воспроизведения, используя NSURLConnection на устройстве. Это должно означать, что AVPlayer каким-то образом не может продолжать использовать доверие, установленное во время этого начального соединения.

Мы также безуспешно пытались добавить учетные данные в [NSURLCredentialStorage sharedCredentialStorage].

Ниже следует наш подход к дробовику:

NSURLProtectionSpace *protectionSpace = [[NSURLProtectionSpace alloc]
                                         initWithHost:host
                                         port:443
                                         protocol:@"https"
                                         realm:nil
                                         authenticationMethod:NSURLAuthenticationMethodClientCertificate];



[[NSURLCredentialStorage sharedCredentialStorage] setDefaultCredential:creds
                                                    forProtectionSpace:protectionSpace];

    NSURLProtectionSpace *protectionSpace2 = [[NSURLProtectionSpace alloc]
                                         initWithHost:host
                                         port:443
                                         protocol:@"https"
                                         realm:nil
                                         authenticationMethod:NSURLAuthenticationMethodServerTrust];



[[NSURLCredentialStorage sharedCredentialStorage] setDefaultCredential:creds
                                                    forProtectionSpace:protectionSpace2];

РЕДАКТИРОВАТЬ: Согласно этот вопрос : вышеупомянутый метод не работает с сертификатами.

Любой намек на то, почему он не работает на устройстве, или приветствуется альтернативное решение!

Ответы [ 2 ]

8 голосов
/ 26 октября 2013

Начиная с iOS 6, AVAssetResourceLoader можно использовать для получения защищенного HTTPS-списка воспроизведения или файла ключа.

Объект AVAssetResourceLoader передает запросы ресурсов от объекта AVURLAsset с предоставленным вами объектом делегата. Когда приходит запрос, загрузчик ресурсов спрашивает вашего делегата, может ли он обработать запрос, и сообщает результаты обратно активу.

Пожалуйста, найдите образец кода ниже.

// AVURLAsset + Loader
AVURLAsset      *asset          = [[AVURLAsset alloc] initWithURL:url options:nil];
AVPlayerItem    *playerItem     = [AVPlayerItem playerItemWithAsset:asset];
AVAssetResourceLoader *loader   = asset.resourceLoader;
[loader setDelegate:self queue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)];

// AVPlayer
AVPlayer        *avPlayer       = [AVPlayer playerWithPlayerItem:playerItem];

Вам потребуется обработать метод resourceLoader: shouldWaitForLoadingOfRequestedResource: делегата, который будет вызываться при необходимости аутентификации, и вы можете использовать NSURLConnection для запроса защищенного ресурса.

(BOOL)resourceLoader:(AVAssetResourceLoader *)resourceLoader    shouldWaitForLoadingOfRequestedResource:(AVAssetResourceLoadingRequest *)loadingRequest
{

 //Handle NSURLConnection to the SSL secured resource here
  return YES;
}

Надеюсь, это поможет!

P.S .: Прокси-подход с использованием CocoaHTTPServer работает хорошо, но использование AVAssetResourceLoader является более элегантным решением.

6 голосов
/ 02 февраля 2012

Похоже, что до тех пор, пока Apple не позволит нам контролировать, какие NSURLConnections AVPlayer использует единственный ответ, кажется, реализовать сервер обратной связи HTTP.

Чтобы процитировать представителя Apple, который ответил на наш вопрос поддержки:

Еще один вариант - реализовать петлю HTTP-сервер и клиентские объекты указывают на это. Клиенты могут использовать HTTP (потому что их запросы никогда не поступают с устройства), в то время как Сам петлевой HTTP-сервер может использовать HTTPS для подключения к источнику сервер. Опять же, это дает вам доступ к основному NSURLConnections, позволяя вам выполнять пользовательскую оценку доверия сервера.

Использование этой техники с UIWebView будет сложно, если вы полностью контролировать контент на исходном сервере. Если происхождение сервер может вернуть произвольный контент, вы должны пролистать вернул HTTP и перепишу все ссылки, что не очень весело. аналогичное ограничение применяется к MPMoviePlayerController / AVPlayer, но в этом случае гораздо чаще контролировать весь контент и таким образом сможете избежать не относительных ссылок.

EDIT: Мне удалось реализовать петлевой сервер с использованием пользовательских реализаций Классы HTTPResponse и HTTPConnection находятся в CocoaHTTPServer

Я не могу раскрыть источник, но я использовал NSURLConnection вместе со смесью демонстрационных ответов AsyncHTTPResponse и DataHTTPResponse.

EDIT: Не забудьте установить myHttpServerObject.interface = @"loopback";

РЕДАКТИРОВАТЬ: ВНИМАНИЕ !!! Этот подход, по-видимому, не работает с трансляцией, поскольку устройство трансляции запрашивает ключи шифрования 127.1.1.1. Правильный подход, кажется, определен здесь: https://developer.apple.com/library/content/documentation/AudioVideo/Conceptual/AirPlayGuide/EncryptionandAuthentication/EncryptionandAuthentication.html#//apple_ref/doc/uid/TP40011045-CH5-SW1

"Укажите ключи в файлах .m3u8 с помощью определенной в приложении схемы URL."

EDIT: Обновление Apple TV и iOS решило проблему, упомянутую в редактировании выше!

...