【发布时间】:2018-11-08 15:30:21
【问题描述】:
使用 iOS 12,我正在观察 AVSystemController_SystemVolumeDidChangeNotification 以检测音量按下以捕获图像:
let volumeView = MPVolumeView(frame: CGRect(x: 0, y: -40, width: 0, height: 0)) // override volume view
view.addSubview(volumeView)
NotificationCenter.default.addObserver(self, selector: #selector(captureImage), name: Notification.Name(rawValue: "AVSystemController_SystemVolumeDidChangeNotification"), object: nil)
但是,我注意到当按下锁定按钮(位于设备右侧)时,通知也会触发,至少在 iPhone XS 和 XS Max 上是这样。
尝试四处搜索,但没有看到任何人提及此问题或对此通知进行过多讨论。其他类似的聆听音量按钮按下的尝试使用 AVAudioSessions / KVO,但我发现每当我使用时,当音量已经达到最大/最小时,观察者不会被调用。这个AVSystemController_SystemVolumeDidChangeNotification 似乎工作得很好,除了这个奇怪的锁定按钮问题。从通知的名称看不出它为什么会响应按下的锁定按钮。
按下锁定按钮时,我在控制台中收到以下消息:
[avas] AVAudioSessionPortImpl.mm:56:ValidateRequiredFields: Unknown selected data source for Port Speaker (type: Speaker) // 出现四次
+[CATransaction synchronize] 在事务中调用 // 出现两次
按下音量按钮时不会出现这些日志。
另外请注意,我不打算提交 App Store,因此我不担心 Apple 是否会因为使用这种可能的私人通知而拒绝此应用。
如果我创建一个AVAudioSession 而不是AVSystemController_SystemVolumeDidChangeNotification 并像这样观察outputVolume:
let audioSession = AVAudioSession()
try? audioSession.setActive(true)
audioSession.addObserver(self, forKeyPath: "outputVolume", options: NSKeyValueObservingOptions.new, context: nil)
…那么当设备锁定时它不会被击中,但我仍然看到“AVAudioSessionPortImpl.mm unknown selected data source for Port Speaker”控制台错误。但是,当音量静音时,它不再接收按下。我想我需要做的是手动更改音量,使其不会达到最小值或最大值?
谢谢
【问题讨论】:
标签: ios notificationcenter mpvolumeview avsystemcontroller