Используя 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] вызывается внутри транзакции // , это появляется дважды
Эти журналы не отображаются при нажатии кнопки громкости.
Обратите внимание, что я не планирую отправлять 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». Но затем, когда звук отключен, он больше не получает нажатий. Я думаю, что мне нужно сделать, это вручную изменить громкость, чтобы она не достигала минимума или максимума?
Спасибо