Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Dombi BenceОтветов: 2

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

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

UIDevice.currentDevice.proximityMonitoringEnabled = NO;

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

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

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

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

iosswiftobjective-cvoiceoverproximitysensor

Ответы

Ответ 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];

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы