Сеанс CallKit Audio начинается только при переходе к приложению - PullRequest
0 голосов
/ 14 мая 2019

Я сейчас работаю над приложением voip и хочу поддержать проведение.Но когда приходит второй звонок, и я удерживаю текущий вызов.Переключаясь на мой первый звонок, я не слышу звука вообще.Чтобы услышать это, нужно перейти от родного экрана callKit к моему приложению, и, следовательно, я могу слышать голос.

func configureAudioSession() {

    _ = try? AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.playAndRecord, mode: .videoChat, options: AVAudioSession.CategoryOptions.mixWithOthers)
    _ = try? AVAudioSession.sharedInstance().overrideOutputAudioPort(AVAudioSession.PortOverride.none)
    _ = try? AVAudioSession.sharedInstance().setMode(AVAudioSession.Mode.voiceChat)
}

func startAudio() {
    print("Starting audio")

    do {
        _ = try AVAudioSession.sharedInstance().setActive(true)
    } catch {
    }
}

  func stopAudio() {
    print("Stopping audio")

    do {
        _ = try AVAudioSession.sharedInstance().setActive(false)
    } catch {
    }
}

1 Ответ

0 голосов
/ 14 мая 2019

Для поддержки удержания вам не нужно запускать / останавливать аудио сеанс, вместо этого вы можете использовать CXSetHeldCallAction, предоставляемый самим Callkit. Вот код удержания, который я использую.

let callKitCallController = CXCallController()

func performHoldAction(isOnHold:Bool, uuid:UUID) {
    let holdCallAction = CXSetHeldCallAction(call: uuid, onHold: isOnHold)
    let transaction = CXTransaction(action: holdCallAction)
    callKitCallController.request(transaction) { error in
        if let error = error {
            CPrint("holdCallAction transaction request failed: \(error.localizedDescription).")
            return
        }
        CPrint("holdCallAction transaction request successful")
    }
}

Как только система переводит вызов в режим удержания (указанным выше методом ИЛИ из-за принятия другого входящего вызова или по любой другой причине), затем в CXProviderDelegate метод func provider(_ provider: CXProvider, perform action: CXSetHeldCallAction) возвращает ответный вызов для получения подробной информации.

Здесь система / callkit сама взаимодействует со звуком, вам не нужно явно запускать или останавливать аудио для удержания.

Примечание: убедитесь, что вы дали supportsHolding - true для CXCallUpdate, который вы дали для нового вызова.

...