Нет звука после подключения к WebRTC, когда приложение запускается в фоновом режиме с использованием PushKit и CallKit на экране блокировки

Все работает нормально, если мы запускаем приложение на переднем плане. Но возникает проблема, когда приложение ранее было убито и перезапущено путем получения уведомления PushKit на экране блокировки.

Когда приложение получает уведомление PushKit, мы отображаем пользовательский интерфейс CallKit. Это работает правильно. Пользователь может ответить на звонок и установить соединение через WebRTC. Но звука нет вообще.

Странно то, что если пользователь открывает приложение с экрана CallKit, нажав на значок приложения, звук запускается и работает должным образом. Похоже, проблема в конфигурации аудиосеанса. Возможно, по какой-то причине iOS не позволяет активировать нашу аудиосеанс.

Мы используем библиотеку Google WebRTC:

pod 'GoogleWebRTC',             '1.1.26115'

Мы пробовали разные подходы:

  1. Включение / выключение фонового звукового режима.

  2. Настройка аудиосеанса до и после получения обратного вызова didActivate от делегата CallKit.

  3. Настройка аудиосеанса вручную и с использованием RTCAudioSession.sharedInstance из библиотеки WebRTC.

  4. Включение и отключение RTCAudioSession.useManualAudio.

Это сценарий, при котором мы сталкиваемся с проблемой:

  1. Убейте приложение. Заблокируйте телефон.

  2. Позвоните этому пользователю с другого телефона.

  3. PushKit запускает приложение, приложение представляет экран CallKit, пользователь отвечает на звонок.

  4. Соединение устанавливается правильно. Вызов активен, но на обоих концах нет звука.

  5. Нажмите на значок приложения (самый нижний правый) на экране CallKit и разблокируйте телефон. Начнется звук.

Любая помощь приветствуется.


person sidslog    schedule 28.03.2019    source источник
comment
Вы пытались настроить аудиосеанс перед вызовом reportNewIncomingCall(with:update:completion:)?   -  person Marco    schedule 28.03.2019
comment
Вероятно, та же проблема, что и ниже: stackoverflow.com/questions/48070163/ Пожалуйста, проверьте мой ответ   -  person Gregios    schedule 21.04.2019
comment
Вы это решили? У вас точно такая же проблема, и вы пробовали все эти способы, но это не помогает.   -  person WorieN    schedule 22.07.2019


Ответы (1)


Существует конкретная проблема со звуковым вводом-выводом и CallKit. Когда вы собираетесь принять входящий вызов, вы должны настроить аудиосеанс для вызовов VoIP, но не активировать его, просто установите категорию, режим и буфер.

Пример настройки аудиосеанса для CallKit входящего вызова:

func configureAudioSession() {
    let sharedSession = AVAudioSession.sharedInstance()
    do {
        try sharedSession.setCategory(AVAudioSessionCategoryPlayAndRecord)
        try sharedSession.setMode(AVAudioSessionModeVoiceChat)
        try sharedSession.setPreferredIOBufferDuration(TimeInterval(0.005))
        try sharedSession.setPreferredSampleRate(44100.0)
    } catch {
        debugPrint("Failed to configure `AVAudioSession`")
    }
}

Затем, когда вы ответите на входящий вызов, CallKit активирует для вас аудиосеанс, и вы получите обратный вызов от CXProvider:

func provider(_ provider: CXProvider, didActivate audioSession: AVAudioSession) {
    // Start call audio I/O here
}

В этом обратном вызове делегата вы должны начать звук вызова, а не раньше. Если ввод-вывод аудио при вызове WebRTC был запущен раньше, CallKit завершит его, и звука не будет.

person Miki    schedule 28.03.2019
comment
Как я могу передать фокус audioSession на webrtc, когда экран заблокирован? По умолчанию вывод звука начинается только тогда, когда я разблокирую экран. - person WorieN; 22.07.2019
comment
Я полагаю, что func provider(_ provider: didActivate:) метод делегата аудиосессии вызывается, когда вы отвечаете на входящий аудио / видеозвонок. В этом обратном вызове вам необходимо включить аудиопроцессор, до тех пор аудиопроцессор должен быть отключен, в противном случае CallKit завершит все запущенные аудио вводы-вывода, что приведет к отсутствию звука во время вызова. - person Miki; 23.07.2019