Вопрос или проблема
Я попробовал много вариантов, но ничего не работает!!!
Каково решение этой проблемы??
Дайте мне советы по этой проблеме.
Дайте знать, если у вас есть идеи, я был бы рад помочь.
Помогите мне
private func setupRemoteTransportControls() { let commandCenter = MPRemoteCommandCenter.shared() commandCenter.playCommand.isEnabled = true commandCenter.playCommand.addTarget { [weak self] _ in self?.togglePlayPause() return .success } commandCenter.pauseCommand.isEnabled = true commandCenter.pauseCommand.addTarget { [weak self] _ in self?.togglePlayPause() return .success } commandCenter.nextTrackCommand.isEnabled = true commandCenter.nextTrackCommand.addTarget { [weak self] _ in self?.playNextSong() return .success } commandCenter.previousTrackCommand.isEnabled = true commandCenter.previousTrackCommand.addTarget { [weak self] _ in self?.playPreviousSong() return .success } commandCenter.changePlaybackPositionCommand.isEnabled = true commandCenter.changePlaybackPositionCommand.addTarget { [weak self] event in guard let self = self, let event = event as? MPChangePlaybackPositionCommandEvent else { return .commandFailed } let newTime = CMTime(seconds: event.positionTime, preferredTimescale: 600) audioPlayer?.seek(to: newTime, toleranceBefore: .zero, toleranceAfter: .zero) songSlider.value = Float(event.positionTime) updateNowPlayingInfoElapsedTime() return .success } } private func setupNowPlaying() { var nowPlayingInfo = [String: Any]() if isFromHome == true || isFromChat == true { nowPlayingInfo[MPMediaItemPropertyTitle] = songName[songIndex] nowPlayingInfo[MPMediaItemPropertyArtist] = songArtist[songIndex] let imageURLString = songImages[songIndex] if let imageURL = URL(string: imageURLString) { URLSession.shared.dataTask(with: imageURL) { data, response, error in guard let data = data, error == nil, let image = UIImage(data: data) else { return } DispatchQueue.main.async { nowPlayingInfo[MPMediaItemPropertyArtwork] = MPMediaItemArtwork(boundsSize: image.size) { size in return image } MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo } }.resume() } } else { nowPlayingInfo[MPMediaItemPropertyTitle] = songdetails?[songIndex].title nowPlayingInfo[MPMediaItemPropertyArtist] = songdetails?[songIndex].artist let imageURLString = songdetails?[songIndex].imgUrl ?? “” if let imageURL = URL(string: imageURLString) { URLSession.shared.dataTask(with: imageURL) { data, response, error in guard let data = data, error == nil, let image = UIImage(data: data) else { return } DispatchQueue.main.async { nowPlayingInfo[MPMediaItemPropertyArtwork] = MPMediaItemArtwork(boundsSize: image.size) { size in return image } MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo } }.resume() } } nowPlayingInfo[MPNowPlayingInfoPropertyPlaybackRate] = audioPlayer?.rate == 1.0 ? 1.0 : 0.0 nowPlayingInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = audioPlayer?.currentTime ?? 0.0 MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo } private func updateNowPlayingInfoElapsedTime() { guard let player = audioPlayer else { return } let currentTime = CMTimeGetSeconds(player.currentTime()) let duration = CMTimeGetSeconds(player.currentItem?.duration ?? CMTime(seconds: 0, preferredTimescale: 1)) var nowPlayingInfo = MPNowPlayingInfoCenter.default().nowPlayingInfo ?? [String: Any]() nowPlayingInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = currentTime nowPlayingInfo[MPMediaItemPropertyPlaybackDuration] = duration nowPlayingInfo[MPNowPlayingInfoPropertyPlaybackRate] = player.rate == 1.0 ? 1.0 : 0.0 MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo } private func updateNowPlayingInfoPlaybackRate(isPlaying: Bool) { var nowPlayingInfo = MPNowPlayingInfoCenter.default().nowPlayingInfo ?? [String: Any]() nowPlayingInfo[MPNowPlayingInfoPropertyPlaybackRate] = isPlaying ? 1.0 : 0.0 MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo } private func updateNowPlaying() { guard let player = audioPlayer else { return } let isPlaying = player.rate > 0.0 MPNowPlayingInfoCenter.default().nowPlayingInfo?[MPNowPlayingInfoPropertyPlaybackRate] = isPlaying ? 1.0 : 0.0 }
Ответ или решение
Изменение статуса кнопок в MPRemoteCommandCenter может не работать по нескольким причинам. Давайте рассмотрим основные моменты, которые необходимо учитывать для успешного управления командами удаленного управления.
1. Убедитесь, что ваш аудиоплеер корректно настроен и запускается
Если плеер (audioPlayer
в вашем коде) не инициализирован должным образом или не активен, команды не будут работать корректно. Убедитесь, что плеер действительно воспроизводит звук перед тем, как вы пытаетесь изменить статус кнопок.
2. Обновление MPNowPlayingInfoCenter
При изменении состояния воспроизведения (играет/пауза) убедитесь, что вы обновили данные в MPNowPlayingInfoCenter
. Отсутствие актуальной информации может привести к тому, что кнопки не будут работать. Например, в методах togglePlayPause()
необходимо вызывать updateNowPlayingInfoPlaybackRate()
после изменения состояния воспроизведения.
3. Обработка событий команды
Для каждой команды (play, pause, next и previous) убедитесь, что вы правильно обрабатываете события. У вас уже реализовано это в методе setupRemoteTransportControls
, но проверьте, что логика в ваших функциях togglePlayPause()
, playNextSong()
и playPreviousSong()
работает надлежащим образом.
4. Актуальность статусов кнопок
Статусы кнопок должны быть актуальными в любой момент времени. Это означает, что вам необходимо обновлять commandCenter.playCommand.isEnabled
, commandCenter.pauseCommand.isEnabled
и другие после каждого изменения состояния плеера. Например, если песня завершилась, кнопка "Play" должна быть включена, а "Pause" — выключена.
Пример исправления
Вот небольшое дополнение вашего метода togglePlayPause()
, где вы можете обновлять статус кнопок в зависимости от состояния плеера:
private func togglePlayPause() {
if audioPlayer?.isPlaying == true {
audioPlayer?.pause()
updateNowPlayingInfoPlaybackRate(isPlaying: false)
// Обновляем статус кнопок
MPRemoteCommandCenter.shared().playCommand.isEnabled = true
MPRemoteCommandCenter.shared().pauseCommand.isEnabled = false
} else {
audioPlayer?.play()
updateNowPlayingInfoPlaybackRate(isPlaying: true)
// Обновляем статус кнопок
MPRemoteCommandCenter.shared().playCommand.isEnabled = false
MPRemoteCommandCenter.shared().pauseCommand.isEnabled = true
}
}
5. Политика обработки команд
Проверьте в коде, чтобы гарантировать, что каждая команда возвращает значение .success
. Это необходимо для того, чтобы подтвердить, что команда обработки прошла успешно.
Заключение
Проверьте все вышеперечисленные моменты. Если после этого проблема не исчезает, возможно, имеет смысл проверить логи ошибок или консоль на наличие сообщений, которые могут указывать на дополнительные проблемы или конфликты в вашем коде. Надеюсь, это поможет вам решить вашу проблему с настройкой статуса кнопок в MPRemoteCommandCenter.