使用 MPMusicPlayerController 时无法修改 MPRemoteCommandCenter 操作

Posted

技术标签:

【中文标题】使用 MPMusicPlayerController 时无法修改 MPRemoteCommandCenter 操作【英文标题】:Can't Modify MPRemoteCommandCenter Actions when using MPMusicPlayerController 【发布时间】:2015-03-20 14:03:18 【问题描述】:

我的应用使用MPMusicPlayerController.systemMusicPlayer() 播放音频,效果很好。

用户可以设置自定义currentPlaybackRate。这按预期工作。

如果用户在锁定屏幕上按下操作(MPRemoteCommandCenter),currentPlaybackRate 将重置为 1。这是因为事件直接发送到系统音乐播放器,而不是应用控制器。

为了将currentPlaybackRate 设置为正确的值,我尝试覆盖MPRemoteCommandCenter 事件:

override func viewDidLoad() 
    super.viewDidLoad()

    AVAudiosession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, error: nil)

    NSNotificationCenter.defaultCenter().addObserver(self, selector: "willEnterForeground:", name: UIApplicationWillEnterForegroundNotification, object: nil)

    NSNotificationCenter.defaultCenter().addObserver(self, selector: "playbackStateChanged:", name: MPMusicPlayerControllerPlaybackStateDidChangeNotification, object: player)
    player.beginGeneratingPlaybackNotifications()

    let rcc : MPRemoteCommandCenter = MPRemoteCommandCenter.sharedCommandCenter()
    rcc.playCommand.addTargetWithHandler  (event: MPRemoteCommandEvent!) -> MPRemoteCommandHandlerStatus in
        NSLog("Lock Screen Play Pressed")
        return MPRemoteCommandHandlerStatus.Success
    
    rcc.togglePlayPauseCommand.addTargetWithHandler  (event: MPRemoteCommandEvent!) -> MPRemoteCommandHandlerStatus in
        NSLog("Lock Screen Play/Pause Pressed")
        return MPRemoteCommandHandlerStatus.Success
    

MPRemoteCommandCenter 在使用MPMusicPlayerController 时是否应该尊重addTargetWithHandler

【问题讨论】:

这个问题你解决了吗? 我有另一个分支,我已将 MPMusicPlayerController 完全替换为 AVAudioPlayer。它可以工作,但意味着你的控制器需要处理更多的逻辑。 【参考方案1】:

如果您真的不需要 MPMusicPlayerController,请尝试使用此解决方案 https://github.com/gangverk/GVMusicPlayerController 这家伙结合了 AVAudioPlayer 和 MPMusicPlayerController 的行为。

但我确实需要一个答案。因为在我的应用中我真的需要 MPMusicPlayerController。

【讨论】:

以上是关于使用 MPMusicPlayerController 时无法修改 MPRemoteCommandCenter 操作的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)