使用 MPRemoteCommandCenter 时未调用播放/暂停回调
Posted
技术标签:
【中文标题】使用 MPRemoteCommandCenter 时未调用播放/暂停回调【英文标题】:Play/Pause callback not getting called when using MPRemoteCommandCenter 【发布时间】:2016-01-21 13:51:25 【问题描述】:我正在构建一个音乐播放器应用程序,一切正常。到目前为止,我一直在使用系统音乐播放器,但现在想切换到使用应用程序音乐播放器,这就是我遇到问题的地方 - 对于我的生活,我无法弄清楚如何获得我的从 ios 控制中心调用的播放/暂停回调。这是我在主视图控制器中使用的代码:
override func viewDidLoad()
super.viewDidLoad()
self.musicPlayer = MPMusicPlayerController.applicationMusicPlayer()
self.registerForMediaPlayerNotifications()
UIApplication.sharedApplication().beginReceivingRemoteControlEvents()
let commandCenter = MPRemoteCommandCenter.sharedCommandCenter()
commandCenter.previousTrackCommand.enabled = false
commandCenter.previousTrackCommand.addTarget(self, action: "previousTrack")
commandCenter.nextTrackCommand.enabled = false
commandCenter.nextTrackCommand.addTarget(self, action: "nextTrack")
commandCenter.togglePlayPauseCommand.enabled = true
commandCenter.togglePlayPauseCommand.addTarget(self, action: "playOrPauseMusic")
commandCenter.pauseCommand.addTarget(self, action: "playOrPauseMusic")
commandCenter.pauseCommand.enabled = true
commandCenter.playCommand.addTarget(self, action: "playOrPauseMusic")
commandCenter.playCommand.enabled = true
[...]
func previousTrack()
func nextTrack()
func playOrPauseMusic()
print("playOrPause")
【问题讨论】:
我唯一能想到的,就是当回调来临时你的对象已经不存在了。您是否将对象存储在某个地方? 你的意思是 commandCenter 对象?不,我不会将它存储在任何地方,因为我认为它是一些全局共享实例,我只需要引用来设置目标/启用/禁用等。我可以尝试一下... 不,我的意思是自我,包含此代码的对象。在它的dealloc
中放一个断点,看看它是否被清理掉了。
哦.. 这段代码在我的主视图控制器中。在显示此主视图时向上滑动以显示命令中心时,播放/暂停甚至不起作用,所以我想它肯定应该仍然存在。
使用 MPRemoteCommandCenter 时无需调用 beginReceivingRemoteControlEvents。
【参考方案1】:
我遇到了同样的问题,并注意到togglePlayPauseCommand
的回调没有被调用,但previousTrackCommand
被调用。所以经过一些实验后,我通过删除 togglePlayPauseCommand
来实现这个工作,而是单独实现 playCommand
和 pauseCommand
的内联回调 - 请注意,使用自定义选择器不起作用,它们必须是内联回调。
let commandCenter = MPRemoteCommandCenter.shared()
commandCenter.playCommand.addTarget (commandEvent) -> MPRemoteCommandHandlerStatus in
moviePlayer.prepareToPlay()
moviePlayer.play()
return MPRemoteCommandHandlerStatus.success
commandCenter.pauseCommand.addTarget (commandEvent) -> MPRemoteCommandHandlerStatus in
moviePlayer.pause()
return MPRemoteCommandHandlerStatus.success
【讨论】:
【参考方案2】:尝试像这样将Required background modes
添加到 Info.plist:
【讨论】:
【参考方案3】:将您的代码放入 viewDidApper。
【讨论】:
以上是关于使用 MPRemoteCommandCenter 时未调用播放/暂停回调的主要内容,如果未能解决你的问题,请参考以下文章
使用 MPRemoteCommandCenter 时未调用播放/暂停回调
使用 MPRemoteCommandCenter 为 AVPlayer 和 AVAudioPlayer 添加当前时间和持续时间的位置
如何从 MPRemoteCommandCenter 禁用所有 MPRemoteCommand 对象
iOS 13+ 应用程序的 AVAudioPlayer AVPlayer AVQueuePlayer MPMusicPlayerController MPRemoteCommandCenter MPN