MacOS 在后台不响应 MPRemoteCommandCenter 命令

J.D*_*Doe 6 macos xcode cocoa mpremotecommandcenter

我正在为我自己的目的编写一个应用程序,旨在无论系统中发生什么都可以获得播放暂停事件。我已经做了这么多工作

let commandCenter = MPRemoteCommandCenter.shared()
commandCenter.togglePlayPauseCommand.isEnabled = true
commandCenter.togglePlayPauseCommand.addTarget { (MPRemoteCommandEvent) -> MPRemoteCommandHandlerStatus in
    print("Play Pause Command")
    return .success
}

commandCenter.nextTrackCommand.isEnabled = true
commandCenter.nextTrackCommand.addTarget { (MPRemoteCommandEvent) -> MPRemoteCommandHandlerStatus in
    print("NextTrackCommand")
    return .success
}
commandCenter.previousTrackCommand.isEnabled = true
commandCenter.previousTrackCommand.addTarget { (MPRemoteCommandEvent) -> MPRemoteCommandHandlerStatus in
    print("previousTrackCommand")
    return .success
}
commandCenter.playCommand.isEnabled = true
commandCenter.playCommand.addTarget { (MPRemoteCommandEvent) -> MPRemoteCommandHandlerStatus in
    print("playCommand")
    return .success
}

MPNowPlayingInfoCenter.default().playbackState = .playing
Run Code Online (Sandbox Code Playgroud)

大多数方法都在那里,因为很明显,如果没有实现 nextTrackCommand 或 previousTrackCommand 或 playCommand ,您将不会收到任何通知。

无论如何,我的一个问题是,一旦您打开另一个使用音频的应用程序,这些事件处理程序就会停止调用,我无法找到检测和解决此问题的方法。

我通常会尝试做 AVAudioSession 事情来将其声明为后台应用程序,但这似乎不起作用。无论系统处于何种状态,关于如何获得游戏暂停事件的任何想法?

我希望能够始终收听这些事件或获得其他人何时控制音频的指示?也许甚至可以重新订阅这些播放暂停事件。

xim*_*ica 4

系统中有一个内部队列,其中包含所有音频事件订阅者。当您开始使用其他应用程序时,它们就会超越它。

我希望能够始终监听这些事件

虽然没有 API 可以实现这一点,但有一个肮脏的解决方法。如果我正确理解你的问题,这个片段:

    MPNowPlayingInfoCenter.default().playbackState = .paused
    MPNowPlayingInfoCenter.default().playbackState = .playing
Run Code Online (Sandbox Code Playgroud)

如果您在应用程序中的某处循环运行它,则必须为您解决问题。

请注意,这并不是 100% 可靠,因为:

  1. 如果在您切换到不同的应用程序后,在两次后续状态更改之前生成了一个事件playbackState,则该事件仍会被活动窗口中的应用程序捕获;
  2. 如果另一个应用程序正在做同样的事情,队列中就会出现持续的竞争条件,结果不可预测。

参考:

或者获取其他人何时控制音频的指示

据我所知,macOS 中没有这方面的公共 API。