MediaPlayer.framework (MPMoviePlayerController) reproduce películas desde una URL que requiere cnetworkingenciales de acceso

Tengo problemas para reproducir películas desde la URL que tiene la authentication básica de http.

Aquí está el código:

NSURLCnetworkingential *cnetworkingential = [[NSURLCnetworkingential alloc] initWithUser:@"user" password:@"password" persistence:NSURLCnetworkingentialPersistenceForSession]; NSURLProtectionSpace *protectionSpace = [[NSURLProtectionSpace alloc] initWithHost:@"moze.dyndns.org" port:80 protocol:@"http" realm:nil authenticationMethod:NSURLAuthenticationMethodHTTPBasic]; [[NSURLCnetworkingentialStorage shanetworkingCnetworkingentialStorage] setDefaultCnetworkingential:cnetworkingential forProtectionSpace:protectionSpace]; NSURL *videoURL = [NSURL URLWithString:@"http://moze.dyndns.org/test/test.mov"]; moviePlayerController = [[MPMoviePlayerViewController alloc] initWithContentURL:videoURL]; [moviePlayerController.view setFrame:self.view.bounds]; [self.view addSubview:moviePlayerController.view]; MPMoviePlayerController *mp = [moviePlayerController moviePlayer]; mp.controlStyle = MPMovieControlStyleDefault; [mp prepareToPlay]; [[moviePlayerController moviePlayer] play]; 

Estoy recibiendo el error "La operación no se pudo completar (Error de MediaPlayerErrorDomain -1013.)", ErrorLog in NULL, al igual que accessLog también.

Estoy usando un server Apache con AuthType Basic, las cnetworkingenciales son correctas, las probé en el browser web. No hay problemas con la reproducción si la authentication está deshabilitada.

Por favor, ayuda, no puedo encontrar lo que está mal.

No pude conseguir MPMoviePlayerController para hacer el desafío de authentication correctamente, incluso si los documentos de Apple dicen lo contrario. La solución MUY hacky que se me ocurrió fue utilizar el CustomHTTPProtocol de Apple para interceptar la respuesta y proporcionar la respuesta de desafío de authentication. Creo que el propósito original de este protocolo era manejar la authentication para UIWebViews .

Enlace a CustomHTTPProtocol : https://developer.apple.com/library/ios/samplecode/CustomHTTPProtocol/Listings/Read_Me_About_CustomHTTPProtocol_txt.html

Mi statement de interfaz:

 @interface SampleViewController() <CustomHTTPProtocolDelegate> 

Instantiación de MPMoviePlayerController dentro de mi SampleViewController :

 NSString *fullURLString = @"http://www.samplesite.com/samplemovie.mp4"; NSURL *fullURL = [NSURL URLWithString:fullURLString]; [CustomHTTPProtocol setDelegate:self]; [CustomHTTPProtocol start]; NSURLCnetworkingential *cnetworkingential = [[NSURLCnetworkingential alloc] initWithUser:@"username" password:@"password" persistence:NSURLCnetworkingentialPersistenceForSession]; NSURLProtectionSpace *protectionSpace = [[NSURLProtectionSpace alloc] initWithHost:fullURL.host port:80 protocol:fullURL.scheme realm:@"your-realm" authenticationMethod:NSURLAuthenticationMethodDefault]; [[NSURLCnetworkingentialStorage shanetworkingCnetworkingentialStorage] setDefaultCnetworkingential:cnetworkingential forProtectionSpace:protectionSpace]; self.moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:fullURL]; [self.moviePlayer prepareToPlay]; [self.moviePlayer setShouldAutoplay:NO]; [self.moviePlayer setControlStyle:MPMovieControlStyleEmbedded]; [self.moviePlayer.view setFrame:self.sampleView.bounds]; [self.moviePlayer.backgroundView setBackgroundColor:[UIColor colorWithWhite:0.9 alpha:1.0]]; [self.moviePlayer.view setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight]; [self.sampleView addSubview:self.moviePlayer.view]; 

También en mi SampleViewController , tengo un par de methods de delegado. Para la authentication básica, es bastante simple:

 - (BOOL)customHTTPProtocol:(CustomHTTPProtocol *)protocol canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace { BOOL canAuth = ([[protectionSpace authenticationMethod] isEqual:NSURLAuthenticationMethodHTTPBasic] && [[protectionSpace realm] isEqualToString:@"your-realm"]); return canAuth; } - (void)customHTTPProtocol:(CustomHTTPProtocol *)protocol didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge { NSURLCnetworkingential *newCnetworkingential = [NSURLCnetworkingential cnetworkingentialWithUser:@"username" password:@"password" persistence:NSURLCnetworkingentialPersistenceForSession]; [[challenge sender] useCnetworkingential:newCnetworkingential forAuthenticationChallenge:challenge]; } 

Después de llamar al start , todas las requestes HTTP y https pasan por el module CustomHTTPProtocol

No CustomHTTPProtocol ya que Apple proporciona la fuente y es muy larga. Hice algunos cambios para que funcione con ARC pero es sobre todo el mismo código.

Espero que esto funcione para ti.