xcode - MacOS 在后台没有响应 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
大多数这些方法都在那里,因为显然如果没有实现 nextTrackCommand 或 previousTrackCommand 或 playCommand ,您将不会收到任何通知。
无论如何,我的一个问题是,一旦您打开另一个使用音频的应用程序,这些事件处理程序就会停止被调用,我无法找到检测和解决此问题的方法。
我通常会尝试做 AVAudioSession 事情以将其声明为后台应用程序,但这似乎不起作用。无论系统处于什么状态,关于如何获得播放暂停事件的任何想法?
我希望能够始终收听这些事件或获得其他人何时控制音频的指示?也许甚至可以重新订阅这些播放暂停事件。
解决方案
系统中有一个包含所有音频事件订阅者的内部队列。当您开始使用它们时,其他应用程序会在它之上。
我希望能够一直监听这些事件
没有 API,但有一个肮脏的解决方法。如果我正确理解你的问题,这个片段:
MPNowPlayingInfoCenter.default().playbackState = .paused
MPNowPlayingInfoCenter.default().playbackState = .playing
如果您在应用程序的某处循环运行它,则必须为您解决问题。
请注意,这不是 100% 可靠的,因为:
playbackState
如果在您切换到另一个应用程序之后,在两个后续状态更改之前生成了一个事件,它仍然会被活动窗口中的应用程序捕获;- 如果另一个应用程序正在做同样的事情,那么队列中就会有一个持续的竞争条件,结果无法预测。
参考:
或获取其他人何时控制音频的指示
据我所知,macOS 中没有用于此的公共 API。
推荐阅读
- html - 使用第 n 个子选择器选择一系列元素
- javascript - React - 我们可以计算组件上的 onMouseEnter 和 onMouseLeave 之间的时间吗?
- excel - 如何防止添加重复单元格
- .htaccess - 制作顶级域,包括带有www的ccTLD,子域为非www,并将所有重定向到https
- android - 如何在不同的按钮单击上连接到不同的 API
- c - “架构 x86_64 的未定义符号:“_main””警告是什么意思?
- find - 一个简单的问题,我想我可以使用任何生物信息学方法
- python - 如何在每个 epoch 后解决恒定的模型精度
- reactjs - 使用扩展运算符更改深层复制值
- python-3.x - 迭代和排序子目录并附加文本文件,在 Python 中另存为一个文件