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.