iOS Objective-C Отключить мониторинг близости, пока VoiceOver активен

Я хотел бы отключить мониторинг приближения, чтобы экран всегда оставался включенным, независимо от того, насколько близко что-то находится к датчику.

Я попробовал это, используя:

UIDevice.currentDevice.proximityMonitoringEnabled = NO;

Обычно он работает должным образом, однако, если я включаю VoiceOver, экран начинает затемняться, если датчик приближения закрыт.

К вашему сведению: я делаю приложение для видеозвонков (используя CallKit) для людей с плохим зрением, и они сталкиваются с тем, что, если они наклоняются слишком близко к экрану во время разговора, экран затемняется, если включен VoiceOver.

Я попытался установить NSTimer, чтобы каждую секунду устанавливать для параметра nearMonitoringEnabled значение NO (как плохой обходной путь), а также пытался установить для него значение YES, а затем NO. Он остается на НЕТ, но экран по-прежнему затемняется.


person Dombi Bence    schedule 04.12.2019    source источник
comment
Вы нашли какое-то решение этой проблемы? У меня та же проблема, что и у вас, и у меня такой же опыт с предлагаемыми решениями. Заранее спасибо!   -  person Anders Gustafsson    schedule 11.12.2020
comment
К сожалению, нет, для этого до сих пор нет решения.   -  person Dombi Bence    schedule 14.01.2021


Ответы (2)


В 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;
person Andy Fedoroff    schedule 09.12.2019
comment
Я уже использую этот параметр, и он все еще не работает должным образом. - person Dombi Bence; 13.12.2019
comment
Не могли бы вы сказать мне, что вы имеете в виду, говоря still not working properly? - person Andy Fedoroff; 13.12.2019
comment
Я пробовал это раньше, и это не решило проблему. Экран по-прежнему затемняется, когда пользователь наклоняется слишком близко. - person Dombi Bence; 13.12.2019
comment
Извините, что опоздал с этим вопросом. Я думаю, что ты упускаешь из виду в своем ответе, Энди, использование голоса за кадром. Ваше решение верно, пока не активирована озвучка. Однако, если вы активируете голос за кадром, экран снова станет пустым, даже если вы используете режим видеочата. - person Anders Gustafsson; 11.12.2020

Я думаю, вам нужно изменить сеанс с AVAudioSessionModeVoiceChat на AVAudioSessionModeVideoChat. Тогда датчик приближения должен игнорироваться

Что-то вроде этого должно делать:

[[AVAudioSession sharedInstance] setMode: AVAudioSessionModeVideoChat error:&err];
person Tristan R.    schedule 09.12.2019
comment
Я уже использую этот параметр, и он все еще не работает должным образом. - person Dombi Bence; 13.12.2019