Я хотел бы отключить мониторинг приближения, чтобы экран всегда оставался включенным, независимо от того, насколько близко что-то находится к датчику.
Я попробовал это, используя:
UIDevice.currentDevice.proximityMonitoringEnabled = NO;
Обычно он работает должным образом, однако, если я включаю VoiceOver, экран начинает затемняться, если датчик приближения закрыт.
К вашему сведению: я делаю приложение для видеозвонков (используя CallKit) для людей с плохим зрением, и они сталкиваются с тем, что, если они наклоняются слишком близко к экрану во время разговора, экран затемняется, если включен VoiceOver.
Я попытался установить NSTimer, чтобы каждую секунду устанавливать для параметра nearMonitoringEnabled значение NO (как плохой обходной путь), а также пытался установить для него значение YES, а затем NO. Он остается на НЕТ, но экран по-прежнему затемняется.
Ответ 1 · рейтинг 2 · Andy Fedoroff
В VoIP-приложениях, использующих Apple CallKit (например, в вашем), вы можете включать и отключать мониторинг приближения во время звонка, используя класс AVAudioSession(). Это известная функция, когда срабатывает датчик приближения и затемняется экран при приближении к лицу пользователя.
По умолчанию (если вы не используете CallKit) свойство экземпляра proximityMonitoringEnabled имеет значение OFF.
@property(nonatomic, getter=isProximityMonitoringEnabled) BOOL proximityMonitoringEnabled;
// or
UIDevice.currentDevice.proximityMonitoringEnabled = NO; // DEFAULT VALUE
В документации для разработчиков Apple говорится:
Включайте мониторинг близости только тогда, когда ваше приложение должно быть уведомлено об изменениях в состоянии близости. В противном случае отключите мониторинг приближения. Значение по умолчанию - НЕТ.
Однако, если вы используете модуль CallKit, proximityMonitoringEnabled ведет себя не так, как ожидалось. По умолчанию мониторинг близости включен - ваше приложение использует для этого AVAudioSessionModeVoiceChat глобальная переменная:
const AVAudioSessionMode AVAudioSessionModeVoiceChat; // DEFAULT VALUE
Вот что говорится в документации разработчика:
Если приложение использует аудиоустройство ввода-вывода с обработкой голоса и не установило его режим в один из режимов чата (голос, видео или игра), AVAudioSessionModeVoiceChat режим будет установлен неявно.
Отключение контроля близости в CallKit
Поэтому, если вы хотите отключить мониторинг близости, просто используйте AVAudioSessionModeVideoChat глобальная переменная:
const AVAudioSessionMode AVAudioSessionModeVideoChat;
Обе переменные работают вместе с AVAudioSessionCategoryPlayAndRecord global Переменная:
const AVAudioSessionCategory AVAudioSessionCategoryPlayAndRecord;
Ответ 2 · Tristan R.
Я думаю, вам нужно изменить сеанс с AVAudioSessionModeVoiceChat на AVAudioSessionModeVideoChat. Тогда датчик приближения должен игнорироваться
Что-то вроде этого должно делать:
[[AVAudioSession sharedInstance] setMode: AVAudioSessionModeVideoChat error:&err];