Мы разрабатываем приложение 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];
РЕДАКТИРОВАТЬ: Согласно этот вопрос : вышеупомянутый метод не работает с сертификатами.
Любой намек на то, почему он не работает на устройстве, или приветствуется альтернативное решение!