Используя 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, при нажатии кнопки блокировки (на правой стороне устройства).
Пытался поискать и не видел, чтобы кто-нибудь упоминал об этой проблеме или много обсуждал это уведомление. Другие аналогичные попытки прослушать нажатия кнопок громкости используют AVAudionSessions / KVO, но я обнаружил, что всякий раз, когда я использовал это, наблюдатель не вызывался, когда громкость уже была на макс / мин. Этот AVSystemController_SystemVolumeDidChangeNotification
, кажется, работает нормально, за исключением этой странной проблемы с кнопкой блокировки. Не понимаю, как, судя по названию уведомления, почему оно будет реагировать на нажатие кнопки блокировки.
При нажатии кнопки блокировки в консоли появляются следующие сообщения:
[avas] AVAudioSessionPortImpl.mm:56:ValidateRequiredFields: Неизвестный выбранный источник данных для динамика порта (тип: динамик) // появляется четыре раза
+ [CATransaction synchronize] вызывается внутри транзакции // появляется дважды
Эти журналы не появляются при нажатии кнопки громкости.
Также обратите внимание, что я не планирую отправлять App Store, поэтому меня не беспокоит, отклонит ли Apple это приложение на основании использования этого, возможно, частного уведомления.
Если вместо AVSystemController_SystemVolumeDidChangeNotification
я создаю AVAudioSession
и наблюдаю outputVolume
вот так:
let audioSession = AVAudioSession()
try? audioSession.setActive(true)
audioSession.addObserver(self, forKeyPath: "outputVolume", options: NSKeyValueObservingOptions.new, context: nil)
… Тогда он не попадает, когда устройство блокируется, но я все еще вижу неизвестный выбранный источник данных AVAudioSessionPortImpl.mm для ошибок консоли Port Speaker. Но затем, когда звук отключен, он больше не получает нажатий. Я думаю, что мне нужно сделать, это вручную изменить громкость, чтобы она не достигала минимального или максимального значения?
Спасибо