La información de xcode – MPNowPlayingInfoCenter no se muestra en iOS 8

Estoy desarrollando una aplicación de música, que debería reproducir música en segundo plano.

Uso el MPMoviePlayerController para reproducir la música. Mi código para iniciar MPMoviePlayerController :

 NSString* resourcePath = [[NSBundle mainBundle] resourcePath]; resourcePath = [resourcePath stringByAppendingString:@"/music.m4a"]; NSError* err; self.player = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL fileURLWithPath:resourcePath]]; if (err) { NSLog(@"ERROR: %@", err.localizedDescription); } AVAudioSession *session = [AVAudioSession sharedInstance]; [session setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionMixWithOthers error:nil]; [session setActive:YES error:nil]; [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; [self.player setShouldAutoplay:NO]; [self.player setControlStyle: MPMovieControlStyleEmbedded]; self.player.view.hidden = YES; [self.player prepareToPlay]; 

Cuando ejecuto [self.player play]; la musica comienza Pero también quiero mostrar el nombre de la canción, el nombre del álbum y la portada del álbum en LockScreen y ControlCenter. Estoy usando el siguiente código:

 Class playingInfoCenter = NSClassFromString(@"MPNowPlayingInfoCenter"); if (playingInfoCenter) { NSMutableDictionary *songInfo = [[NSMutableDictionary alloc] init]; MPMediaItemArtwork *albumArt = [[MPMediaItemArtwork alloc] initWithImage: [UIImage imageNamed:@"artwork.png"]]; [songInfo setObject:@"SongName" forKey:MPMediaItemPropertyTitle]; [songInfo setObject:@"ArtistName" forKey:MPMediaItemPropertyArtist]; [songInfo setObject:@"AlbumTitle" forKey:MPMediaItemPropertyAlbumTitle]; [songInfo setObject:albumArt forKey:MPMediaItemPropertyArtwork]; [[MPNowPlayingInfoCenter defaultCenter] setNowPlayingInfo:songInfo]; } 

Pero nada se muestra en LockScreen. Tampoco se muestra en el ControlCenter.

¿Cómo puedo resolver mi problema? No encontré nada en internet.

Gracias de antemano, Fabian.

El problema es que no estás cumpliendo los requisitos para convertirte en el maestro de la pantalla de locking y del centro de control, como explico en mi libro . Deberías ver el equivalente moderno (iOS 8) de esto:

enter image description here

El hecho de que no lo esté viendo sugiere que está omitiendo uno o más de los requisitos, que enumero (citando directamente de mi libro aquí):

  • Su aplicación debe contener un UIResponder en su cadena de respuesta que devuelve SÍ desde canBecomeFirstResponder , y ese respondedor debe ser el primero en responder.
  • Algunos UIResponder en la cadena de respuesta, en el primer respondedor o por encima de él, deben implementar remoteControlReceivedWithEvent:
  • Su aplicación debe llamar al método de instancia beginReceivingRemoteControlEvents .
  • La política de la sesión de audio de su aplicación debe ser Reproducción.
  • Tu aplicación debe estar emitiendo algo de sonido.

No sé cuál de ellos está omitiendo; podría ser más de uno. Puede que quiera comparar su código con un ejemplo de trabajo, aquí:

https://github.com/mattneub/Programming-iOS-Book-Examples/blob/master/iOS7bookExamples/bk2ch14p653backgroundPlayerAndInterrupter/backgroundPlayer/backgroundPlayer/ViewController.m

¿Desea expandir la respuesta de @ matt? – setting nowPlayingInfo es inútil cuando usa la opción AVAudioSessionCategoryOptionMixWithOthers .

Ampliando aún más la respuesta de @ matt, se requiere que llame a endReceivingRemoteControlEvents y resignFirstResponder cuando la aplicación vuelva a estar en primer plano ( applicationDidBecomeActive ). De lo contrario, el sistema operativo asume que es un mal actor (u olvidó apagarlos) y desactiva su capacidad de mostrar los controles de suspensión por completo, incluso después de llamar nuevamente a beginReceivingRemoteControlEvents . Agregué estas llamadas y ahora los controles de suspensión siempre se muestran cuando deberían.