Как узнать, когда MPMusicPlayerController меняет игровой элемент естественным образом - PullRequest
0 голосов
/ 17 января 2019

Я использую MPMusicPlayerController для создания музыкального проигрывателя в моем приложении. У меня все отлично работает, за исключением одной маленькой проблемы:

Когда песни меняются естественным образом - одна песня заканчивается, а другая начинается с заданной очереди - уведомление MPMusicPlayerControllerNowPlayingItemDidChange не вызывается.

В настоящее время я использую уведомления MPMusicPlayerControllerNowPlayingItemDidChange и MPMusicPlayerControllerPlaybackStateDidChange. Они охватывают воспроизведение, паузу, случайное воспроизведение, повтор, следующее, предыдущее и т. Д. Когда нажимаются уведомления, я затем обновляю экран на основе MPMusicPlayerController, чтобы показать новую песню, исполнителя или требуемые значки других кнопок. Однако ни один из них не вызывается, когда песня заканчивается и автоматически начинается воспроизведение следующей - это означает, что название и исполнитель предыдущей песни остаются до тех пор, пока пользователь не перезагрузит экран или не будет взаимодействовать с элементами управления звуком, что не очень удобно для пользователя.

За исключением регулярной проверки соответствия текущего имени игровому имени, я не знаю, как обновить это в обычном потоке приложения.

NotificationCenter.default.addObserver(
  forName: NSNotification.Name.MPMusicPlayerControllerNowPlayingItemDidChange,
  object: musicPlayerController,
  queue: nil) { _ in
    // Update view
}

1 Ответ

0 голосов
/ 17 января 2019

Ответ на этот вопрос оказывается очень простым, но его также сложно определить, если вы ищете неправильное место.

Прежде чем мы добавим наших наблюдателей, нам нужно начать генерировать уведомления о воспроизведении:

musicPlayerController.beginGeneratingPlaybackNotifications()

NotificationCenter.default.addObserver(self,
                                       selector: #selector(refreshView),
                                       name: .MPMusicPlayerControllerPlaybackStateDidChange,
                                       object: musicPlayerController)

NotificationCenter.default.addObserver(self,
                                       selector: #selector(refreshView),
                                       name: .MPMusicPlayerControllerNowPlayingItemDidChange,
                                       object: musicPlayerController)

Нам также нужно помнить, чтобы завершить генерацию их, когда мы покидаем (освобождаем) представление:

deinit {
    NotificationCenter.default.removeObserver(self, name: .MPMusicPlayerControllerPlaybackStateDidChange, object: nil)
    NotificationCenter.default.removeObserver(self, name: .MPMusicPlayerControllerNowPlayingItemDidChange, object: nil)
    musicPlayerController.endGeneratingPlaybackNotifications()
}

Путаница возникла из-за того, что musicMediaPlayer возвратил несколько уведомлений даже без этого, что не указывало на то, что мы не наблюдали все уведомления, которые запускались.

Примечание: Стоит отметить, что на момент написания этой статьи обсуждался вопрос о необходимости ручного удаления наблюдателей - я включил его здесь для полноты ответа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...