MPNowPlayingInfoCenter desaparece cuando la transmisión de audio bloquea

Mi aplicación reproduce la transmisión de audio a través de AVPlayer y usa MPNowPlayingInfoCenter para mostrar información sobre la transmisión en la pantalla de locking del dispositivo.

Esto funciona bien cuando se está reproduciendo audio, pero si la transmisión se paraliza debido a las ralentizaciones de la networking (es decir, recibo AVPlayerItemPlaybackStalledNotification ), la información desaparece de la pantalla de locking. Pero luego, si la secuencia continúa jugando, reaparece.

Esto es confuso porque cuando la información que se está reproduciendo ahora desaparece de la pantalla de locking, da la apariencia de que la aplicación ha detenido la reproducción. Pero luego reanuda la reproducción, cuando la interfaz de usuario de la pantalla de locking parece indicar que esto no sucederá.

¿Hay algo que pueda hacer para asegurarse de que la información que se está reproduciendo ahora permanezca visible cada vez que se deba reproducir la transmisión, pero actualmente no se debe a problemas de velocidad de la networking? Parece que la única manera de mantener una IU de pantalla de locking consistente es realmente matar la connection de networking cuando se detiene, lo cual es un poco estúpido, pero al less no confuso.

En caso de que más detalles ayuden:

  • Cuando la aplicación recibe esa notificación, lo único que hace es actualizar la interfaz de usuario.
  • La aplicación nunca borra MPNowPlayingInfoCenter cuando hay un progtwig actual, por lo que siempre que se suponga que la transmisión se está reproduciendo, hay datos no vacíos que deberían mostrarse.

Si tuviera que adivinar (y ha pasado un time desde que utilicé AVFoundation) asumiría que su session de audio está siendo desactivada por el sistema operativo tan pronto como los datos dejan de fluir a través del búfer de audio. Un truco sería mantener un segundo AVPlayer que reproduzca el silencio para completar los puntos muertos hasta que hayas almacenado suficientes datos para reanudar la reproducción o que hayas llegado a algún time de espera y simplemente te rindas. Use la notificación para cambiar entre los objects del jugador.

No tengo ningún problema al configurar la pantalla de locking incluso en el problema de networking.

También estoy tratando con la transmisión.

Y creo que la pantalla de locking solo se ve afectada cuando la session de audio está activa o no.

Aquí puedes ver mi código y no tengo ningún problema, espero que esto te ayude.

 -(void)setLockScreen { Class playingInfoCenter = NSClassFromString(@"MPNowPlayingInfoCenter"); if (playingInfoCenter) { [[AVAudioSession shanetworkingInstance] setActive:YES error:nil]; NSError *myErr; if (![[AVAudioSession shanetworkingInstance] setCategory:AVAudioSessionCategoryPlayback error:&myErr]) { // Handle the error here. NSLog(@"Audio Session error %@, %@", myErr, [myErr userInfo]); } else { [[UIApplication shanetworkingApplication] beginReceivingRemoteControlEvents]; [self becomeFirstResponder]; } MPMediaItemArtwork *albumArt = [[MPMediaItemArtwork alloc] initWithImage:imgViewLogo.image]; NSArray *keys = [NSArray arrayWithObjects: MPMediaItemPropertyTitle, MPMediaItemPropertyArtist, MPMediaItemPropertyArtwork, MPNowPlayingInfoPropertyPlaybackRate, nil]; NSArray *values = [NSArray arrayWithObjects: [[self.arrChannel objectAtIndex:[AppDelegate shanetworkingAppDelegate].selectedRow] objectForKey:@"name"], [[AppDelegate shanetworkingAppDelegate].dictChannelsConfig objectForKey:@"venueName"], albumArt, [NSNumber numberWithInt:1], nil]; NSDictionary *mediaInfo = [NSDictionary dictionaryWithObjects:values forKeys:keys]; keys = nil; values = nil; albumArt = nil; [[MPNowPlayingInfoCenter defaultCenter] setNowPlayingInfo:mediaInfo]; mediaInfo = nil; } }