使用 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 来实现这个工作,而是单独实现 playCommandpauseCommand 的内联回调 - 请注意,使用自定义选择器不起作用,它们必须是内联回调。

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

如何从 MPRemoteCommandCenter 禁用所有 MPRemoteCommand 对象

iOS 13+ 应用程序的 AVAudioPlayer AVPlayer AVQueuePlayer MPMusicPlayerController MPRemoteCommandCenter MPN

是否可以检测音乐控件