Estoy usando MPMusicPlayerController para crear un reproductor de música en mi aplicación. Tengo todo funcionando muy bien, excepto por un pequeño problema:
Cuando las canciones cambian naturalmente (una canción termina y la siguiente comienza desde la cola establecida), la notificación MPMusicPlayerControllerNowPlayingItemDidChange no parece ser llamada.
En este momento estoy utilizando las notificaciones MPMusicPlayerControllerNowPlayingItemDidChange y MPMusicPlayerControllerPlaybackStateDidChange . Estos cubren reproducción, pausa, reproducción aleatoria, repetición, siguiente, anterior, etc. Cuando se presionan las notificaciones, actualizo la pantalla según MPMusicPlayerController para mostrar la nueva canción, el artista o los diferentes íconos de botón requeridos. Sin embargo, ninguno de estos se llama cuando termina una canción y la siguiente comienza a reproducirse automáticamente; esto significa que el título y el artista de la canción anterior se dejan hasta que el usuario vuelve a cargar la pantalla o interactúa con los controles de audio, lo que no es una buena experiencia para el usuario.
Aparte de verificar regularmente si el nombre actual coincide con el nombre de juego, no sé cómo actualizar esto en el flujo normal de la aplicación.
NotificationCenter.default.addObserver( forName: NSNotification.Name.MPMusicPlayerControllerNowPlayingItemDidChange, object: musicPlayerController, queue: nil) { _ in // Update view }La respuesta a esto resulta ser muy simple pero también difícil de detectar si no estás buscando en el lugar correcto.
Antes de agregar a nuestros observadores, debemos comenzar a generar las notificaciones de reproducción:
musicPlayerController.beginGeneratingPlaybackNotifications() NotificationCenter.default.addObserver(self, selector: #selector(refreshView), name: .MPMusicPlayerControllerPlaybackStateDidChange, object: musicPlayerController) NotificationCenter.default.addObserver(self, selector: #selector(refreshView), name: .MPMusicPlayerControllerNowPlayingItemDidChange, object: musicPlayerController)También debemos recordar dejar de generarlos cuando dejemos (desasignar) la vista:
deinit { NotificationCenter.default.removeObserver(self, name: .MPMusicPlayerControllerPlaybackStateDidChange, object: nil) NotificationCenter.default.removeObserver(self, name: .MPMusicPlayerControllerNowPlayingItemDidChange, object: nil) musicPlayerController.endGeneratingPlaybackNotifications() }La confusión provino de que musicMediaPlayer devolvió una serie de notificaciones, incluso sin esto, lo que no apuntaba al hecho de que no estábamos observando todas las notificaciones que se estaban disparando.
Nota: vale la pena señalar que, en el momento de escribir esto, se estaba discutiendo si era necesario eliminar manualmente a los observadores; lo he incluido aquí para completar la respuesta.