Desafortunadamente, MPMoviePlayerController
(hasta iOS 4.3 pero sin incluir) no tiene una identificación detallada de problemas de lo que está disponible en la documentación. Simplemente devuelve MPMovieFinishReasonPlaybackError
en caso de cualquier problema dentro de la UserInfo de ese MPMoviePlayerPlaybackDidFinishNotification
.
Con iOS 4.3 finalmente obtuvimos las propiedades errorLog
y accessLog
que contienen información extensa y bastante útil. Ver MPMoviePlayerController Reference.
Con iOS 5.0 hay una clave error
que viene con esa notificación también en las compilaciones de dispositivos y no solo dentro del simulador. Esa error
es una instancia de NSError
y proporciona información muy útil. Lamentablemente, Apple no ha documentado esto, por lo que puede cambiar en cualquier versión de iOS. Además, parece que no hay explicación sobre los códigos de error dados. Por ejemplo, un HTTP-Status: 404 daría como resultado un código de error -1100
dentro de la instancia de error dada. Sin embargo, esto sería un ejemplo de cómo manejar esta notificación de la manera más adecuada.
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleMPMoviePlayerPlaybackDidFinish:)
name:MPMoviePlayerPlaybackDidFinishNotification
object:nil];
Eso sería un controlador de notificación adecuada:
- (void)handleMPMoviePlayerPlaybackDidFinish:(NSNotification *)notification
{
NSDictionary *notificationUserInfo = [notification userInfo];
NSNumber *resultValue = [notificationUserInfo objectForKey:MPMoviePlayerPlaybackDidFinishReasonUserInfoKey];
MPMovieFinishReason reason = [resultValue intValue];
if (reason == MPMovieFinishReasonPlaybackError)
{
NSError *mediaPlayerError = [notificationUserInfo objectForKey:@"error"];
if (mediaPlayerError)
{
NSLog(@"playback failed with error description: %@", [mediaPlayerError localizedDescription]);
}
else
{
NSLog(@"playback failed without any given reason");
}
}
}
Por último, pero no menos importante, no se olvide de quitar ese controlador de notificación del centro por defecto cuando se libera la instancia del objeto que estamos manejando dentro.
[[NSNotificationCenter defaultCenter] removeObserver:self
name:MPMoviePlayerPlaybackDidFinishNotification
object:nil];
Esto es maravilloso, pero parece que está roto. El uso de iOS 8.1 y mi MPMoviePlayer.url está obteniendo el error 404, pero no está activando el [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector (playbackDidFinish :) name: MPMoviePlayerPlaybackDidFinishNotification object: nil]; – Lombas
Dado que Apple ha dejado de utilizar MPMoviePlayer, creo que es una apuesta mucho más segura utilizar AVFoundation. – Till