首页 > 解决方案 > iOS 15 后 AVSystemController_AudioVolumeNotificationParameter 的替代方案?

问题描述

用于响应设备音量级别变化的经批准的 KVO 方法在达到最小/最大 outputVolume 后停止检测音量按钮按下我想在最小/最大之后继续接收这些按钮按下事件,所以我认为我需要尝试这个解决方案,即使它不受 Apple 支持。但是,我是一个非常业余的 iOS 程序员,所以我可以使用提示。这是我一直在做的事情(使用 RxSwift):

NotificationCenter.default.rx.notification(Notification.Name(rawValue: "AVSystemController_AudioVolumeNotificationParameter"))
                .subscribe(onNext: { [weak self] notification in
                    guard let my = self else { return }
                    my.volumeNotification.accept(notification.userInfo!["AVSystemController_AudioVolumeNotificationParameter"] as! Double)
                })
                .disposed(by: disposeBag)

我是否应该订阅名为“MPVolumeControllerDataSource_SystemVolumeDidChange”的通知?

提前致谢!

标签: iosvolumeios15

解决方案


为开源欢呼三声,具体来说:JPSVolumeButtonHandler。这个组件像冠军一样工作,并使用 Apple 认可的 KVO 技术。请注意,此组件将 AVAudioSession 选项设置为 .mixWithOthers,这会阻止 MPRemoteCommandCenter 接收/处理任何蓝牙命令。因此,如果您需要 BT (Swift 5):

let volumeButtonHandler = JPSVolumeButtonHandler(up: {
    // handle up press
}, downBlock: {
    // handle down press
})
volumeButtonHandler.sessionOptions = [] // allow remote BT

我还发现在初始化按钮处理程序之前以编程方式将设备音量设置为 0.5 可以避免偶尔出现最小/最大障碍。如果设备初始音量接近最小值或最大值,则处理程序将在按下几个按钮后停止:

try AVAudioSession.sharedInstance().setActive(true, options: [])
MPVolumeView(frame: .zero).volumeSlider.value = 0.5

推荐阅读