Responder a las notifications de MPMoviePlayerController durante la reproducción de medios de background

Tengo una aplicación que transmite video desde la networking y la reproduce usando un object MPMoviePlayerController para la reproducción en el dispositivo o vía AirPlay.

La aplicación admite la operación en segundo plano y tiene la opción 'audio' listda dentro de la key UIBackgroundModes requerida en su file Plist.

Cuando juegue sobre AirPlay, la aplicación puede colocarse con éxito en segundo plano y el video continúa reproduciéndose correctamente. Hasta aquí todo bien.

De acuerdo con la documentation de Apple :

La inclusión de la key de audio le dice a los frameworks del sistema que deben seguir reproduciéndose y hacer las devoluciones de llamada necesarias a la aplicación a intervalos apropiados. Si la aplicación no incluye esta key, cualquier audio que se reproduce por la aplicación se detiene cuando la aplicación se mueve al background.

Sin embargo, estas devoluciones de llamada no se realizan.

La aplicación utiliza dos types de callback: los asociados con las notifications que MPMoviePlayerController y AVPlayer envían durante la reproducción, junto con devoluciones de llamada basadas en el timer que supervisan la position de reproducción y las statistics de performance con fines de monitoreo.

Mirando las notas de Apple, sin duda esperaba recibir el primer tipo de callback para que la aplicación pueda responder a MPMoviePlayerPlaybackStateDidChangeNotification , MPMoviePlayerPlaybackDidFinishNotification y MPMoviePlayerLoadStateDidChangeNotification , pero esto no sucede.

¿Alguien sabe si es posible recibir estos durante la reproducción de AirPlay en segundo plano y, de ser así, cómo se logró esto?

** Tenga en count: la aplicación funciona correctamente cuando se ejecuta en primer plano y recibe las notifications bien. Es solo cuando se presiona a un segundo plano y se juega con AirPlay que las notifications no se reciben.

Del mismo modo, el video reproduce correctamente AirPlay en segundo plano. Solo son las notifications las que no se reciben **

Tuve este problema y lo he solucionado aunque hacía unos meses. Podría enviarle toda mi class para la reproducción de películas si esto no funciona. Tenga en count que está utilizando el model del controller de navigation.

NOTA: Esto se testing en el iPad 2 y no en el iPhone.

Le muestro mi VC así:

  - (IBAction)playMovie:(id)sender { MovieVC* movController = [[MovieVC alloc] initWithID:2]; movController.view.backgroundColor = [UIColor blackColor]; AppDelegate *appDel = [[UIApplication shanetworkingApplication] delegate]; [appDel.navigationController pushViewController:movController animated:NO]; [movController release]; } 

Luego, en mi class de controller de vista MovieVC, configuré la reproducción de video así:

 - (void)initMoviePlayer { mMoviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:[self getMovieURL]]; mMoviePlayer.allowsAirPlay = YES; mMoviePlayer.view.frame = [self.view bounds]; mMoviePlayer.view.backgroundColor = [UIColor clearColor]; mMoviePlayer.shouldAutoplay = YES; mMoviePlayer.fullscreen = YES; mMoviePlayer.scalingMode = MPMovieScalingModeAspectFit; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePreloadDidFinish:) name:MPMoviePlayerLoadStateDidChangeNotification object:mMoviePlayer]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayBackDidFinish:) name:MPMoviePlayerPlaybackDidFinishNotification object:nil]; } 

Esto lo arregló para mí, si no corrige el comentario y no lo edita con todo el file de class.

En uno de mis proyectos, hice lo que hizo, y funcionó para mí. Dos diferencias en mi proyecto:

  • No estoy transmitiendo a través de airPlay (reproducción de dispositivo solamente),
  • Solo estoy jugando files de audio.

Mi paso por paso:

  • Agregue la opción de audio a UIBackgroundModes en el file Plist,
  • Regístrese en NotificationCenter para MPMoviePlayerPlaybackDidFinishNotification y MPMoviePlayerPlaybackStateDidChangeNotification con el siguiente código:

     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playbackStateChanged:) name:MPMoviePlayerPlaybackStateDidChangeNotification object:moviePlayer]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playbackEnded:) name:MPMoviePlayerPlaybackDidFinishNotification object:moviePlayer]; 

Funciona a las mil maravillas.

Para completar, debo agregar que en este momento creo que no hay solución a este problema.

Lo he discutido directamente con Apple a través del soporte técnico y no había ninguna práctica práctica disponible.

Esta funcionalidad fue necesaria para permitir que la aplicación registre statistics sobre la reproducción de la transmisión a intervalos regulares. Si bien esto está bien cuando el video se reproduce en la pantalla del dispositivo y sobre AirPlay mientras la aplicación está en primer plano, no es posible hacerlo con la aplicación en segundo plano.

La solución que he utilizado es desactivar el timer de inactividad durante todos los types de reproducción y volver a habilitarlo luego usando:

 [UIApplication shanetworkingApplication].idleTimerDisabled = YES; 

y

 [UIApplication shanetworkingApplication].idleTimerDisabled = NO; 

Si bien esta no es una solución a la pregunta original, es una solución para evitar el problema en primer lugar.