2011-03-18 15 views
10

Quiero mostrar UIAlert si falla la reproducción de video. Así que registró el MPMoviePlayerPlaybackDidFinishNotification para mi reproductor de películas:Cómo obtener una descripción del error cuando la reproducción falla en MPMoviePlayerController

[[NSNotificationCenter defaultCenter] addObserver: Selector auto: @selector (myMovieFinishedCallback :) Nombre: MPMoviePlayerPlaybackDidFinishNotification objeto: self.moviePlayer];

En mi myMovieFinishedCallback: verifico si en el Diccionario de información del usuario hay un objeto llamado error. En mi dispositivo real no recibo este error (en caso de error de red, error 404 para el archivo). En el simulador de iPhone recibo el error.

¿Cómo puedo verificar correctamente el razonamiento cuando recibo el MPMoviePlayerPlaybackDidFinishNotification?

Respuesta

18

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]; 
+0

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

+1

Dado que Apple ha dejado de utilizar MPMoviePlayer, creo que es una apuesta mucho más segura utilizar AVFoundation. – Till

0

Usted puede mirar en el valor detrás del diccionario userinfo de MPMoviePlayerPlaybackDidFinishReasonUserInfoKey. Si el valor es MPMovieFinishReasonPlaybackError, puede suponer que algunas cosas salieron mal. Este método es bastante fiable.

2

Tuve el mismo problema. aunque estaba registrando la función de devolución de llamada MPMoviePlayerLoadSiddChangeNotification y obteniendo el error de la variable userInfo, no mostraba el error. Pasé mucho tiempo buscando en los foros y después de jugar con el código me di cuenta de cuál era el problema.

Primero debe registrar la función de devolución de llamada:

// Register that the did finish notification (movie stopped) 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(myMovieFinishedCallback:) name:MPMoviePlayerPlaybackDidFinishNotification object:self.moviePlayer]; 

Dentro de la función de devolución de llamada MovieFinished se necesita:

NSDictionary *notice = [paramNotification userInfo]; 

if (notice != nil) 
{ 
    NSError *errorInfo = [notice objectForKey:@"error"]; 

    if (errorInfo != nil) { 
     UIAlertView *notice = [[UIAlertView alloc] initWithTitle:@"Error" message:[errorInfo localizedDescription] delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
     [notice show]; 
     [notice release];    
    } 
} 

Este código mostrará cualquier error relacionado con el moviecontroller. Entonces ... ¿cuál era el problema en mi código? ... Estaba usando el método [moviecontroller play] en los lugares incorrectos, así que revisa eso en el tuyo.

¡Buena suerte!

+0

Gracias, vi un mensaje de error con este fragmento. –

Cuestiones relacionadas