videos puedo peliculas paso pasar musica laptop con como carrete archivos ios stream xcode5 mpmovieplayercontroller nsurlcredential

ios - puedo - como paso peliculas al ipad



Transmita películas grandes con credenciales a través de MPMoviePlayer (2)

He intentado transmitir una película desde una URL protegida. Puedo descargar la película y luego reproducirla, pero la película es demasiado larga, así que esto es molesto.

Aquí está mi código:

-(MPMoviePlayerController *)moviePlayerController { NSURL *url = [NSURL URLWithString:@"http://ABcDE.com/secret/Movie.mov"]; _moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:url]; NSURLCredential *credential = [[NSURLCredential alloc] initWithUser: @"user" password: @"password" persistence: NSURLCredentialPersistencePermanent]; NSURLProtectionSpace *protectionSpace = [[NSURLProtectionSpace alloc] initWithHost: [url host] port: 80 protocol: [url scheme] realm: [url host] authenticationMethod: NSURLAuthenticationMethodDefault]; [[NSURLCredentialStorage sharedCredentialStorage] setDefaultCredential: credential forProtectionSpace: protectionSpace]; _moviePlayer.view.frame = CGRectMake(0, 0, 500, 500); _moviePlayer.controlStyle = MPMovieControlStyleDefault; _moviePlayer.shouldAutoplay = YES; _moviePlayer.backgroundView.backgroundColor = [UIColor blackColor]; _moviePlayer.allowsAirPlay = YES; _moviePlayer.movieSourceType = MPMovieSourceTypeStreaming; return _moviePlayer; }

He intentado encadenar el reino a nada que no funcionó. Traté de mover el initWitcontnetURL después de la

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

eso tampoco funcionó

Desde el método - (void) moviePlayBackDidFinish: (NSNotification *) recibo el error Error Domain = MediaPlayerDomain Code = -1013 "La operación no pudo completarse. (MediaPlayerErrorDomain error -1013.)"

En cuanto a la documentación de Apple, es un error CFNetwork kCFURLErrorUserAuthenticationRequired = -1013

¿Alguna idea de como resolver esto?


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

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

Mi declaración de interfaz:

@interface SampleViewController() <CustomHTTPProtocolDelegate>

Instanciación de MPMoviePlayerController dentro de SampleViewController :

NSString *fullURLString = @"http://www.samplesite.com/samplemovie.mp4"; NSURL *fullURL = [NSURL URLWithString:fullURLString]; [CustomHTTPProtocol setDelegate:self]; [CustomHTTPProtocol start]; NSURLCredential *credential = [[NSURLCredential alloc] initWithUser:@"username" password:@"password" persistence:NSURLCredentialPersistenceForSession]; NSURLProtectionSpace *protectionSpace = [[NSURLProtectionSpace alloc] initWithHost:fullURL.host port:80 protocol:fullURL.scheme realm:nil authenticationMethod:NSURLAuthenticationMethodDefault]; [[NSURLCredentialStorage sharedCredentialStorage] setDefaultCredential:credential 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 métodos de delegado. Para la autenticación 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 { NSURLCredential *newCredential = [NSURLCredential credentialWithUser:<username> password:<password> persistence:NSURLCredentialPersistenceForSession]; [[challenge sender] useCredential:newCredential forAuthenticationChallenge:challenge]; }

Después de llamar al start , todas las solicitudes http y https pasan por el módulo CustomHTTPProtocol

No CustomHTTPProtocol ya que Apple proporciona la fuente y es realmente larga. Hice algunos cambios para que funcione con ARC, pero en su mayoría es el mismo código.

Espero que esto funcione para ti.


Si su servidor de video espera autenticación básica, puede pasarse fácilmente a la URL del controlador del reproductor de películas, por ejemplo, en lugar de la url regular, pasará la url en formato:

http(s)://user:password@host/path

Luego se reproducirá el video.