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

Все работает нормально, если мы запустим приложение на переднем плане. Но есть проблема, когда приложение ранее было убито и перезапущено, получив уведомление 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 и разблокируйте телефон. Звук начинается.

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

1 Ответ

0 голосов
/ 28 марта 2019

Существует определенная проблема с аудио вводом / выводом и 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 прервет его и звука не будет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...