Таймер звонка начинает отсчет сразу после того, как вызываемый абонент принимает вызов - PullRequest
2 голосов
/ 29 марта 2019

Я интегрирую звонки в свое приложение. В документации CallKit https://developer.apple.com/documentation/callkit есть текст:

После установления соединения система вызывает метод провайдера (_: execute :) делегата провайдера. В вашей реализации делегат отвечает за настройку AVAudioSession и вызову execute () для действия по завершении.

И фрагмент кода:

func provider(_ provider: CXProvider, perform action: CXAnswerCallAction) {
    // configure audio session
    action.fulfill()
}

А по поводу execute () , метод:

Этот метод следует вызывать только из реализации метода CXProviderDelegate.

Итак, как я понял, мы должны вызывать action.fulfill () немедленно, после того, как вызываемый абонент принимает вызов.

Проблема: Когда устройство заблокировано, таймер вызовов на собственном экране CallKit начинает отсчет, но соединение еще не установлено.

Вопрос: Как я могу вызвать action.fulfill () или запустить таймер на заблокированном экране CallKit, когда будет установлено соединение. Могу ли я как-то контролировать эту метку таймера на заблокированном экране?

1 Ответ

1 голос
/ 01 апреля 2019

Ожидается, что вы вызываете логику ответа в этом обратном вызове делегата.

func provider(_ provider: CXProvider, perform action: CXAnswerCallAction) {
    // configure audio session
    // Performing call answering logic
    // Call action to fulfill after answering logic is finished
    action.fulfill()
}

Я использую PJSIP для вызовов VoIP, и вот так выглядит моя логика ответа

func provider(_ provider: CXProvider, perform action: CXAnswerCallAction) {

    guard let call = CallList.sharedInstance().call(withUUID: action.callUUID.uuidString) else {
        action.fail()
        return
    }

    CallAudio.configureAudioSession()

    // Answer call (signal Pjsua)
    Pjsua2Wrapper.sharedInstance()?.answerCall(withCallUUID: call.callUUID, completion: { error in
        if error != nil {
            // we have error on answer call
            action.fail()
        } else {
            action.fulfill()
        }
    })
}
* 1006.* Обработчик завершения ответа на вызов вызывается после завершения ответа, поэтому таймер запускается при подключении к вызову.

РЕДАКТИРОВАТЬ

Проблема со звуком в PJSIP

Если вы используете PJSIP, вам нужно остановить аудио ввод / вывод при инициализации PJSIP, например так (это C ++):

enableSoundDevice( false );

И когда на вызов ответят, CallKit ответит с помощью funcprovider(_:didActivate:).Вот где вам нужно активировать звуковое устройство PJSIP, чтобы получить звук.

Это пример из моего кода:

func provider(_ provider: CXProvider, didActivate audioSession: AVAudioSession) {
    // Start call audio I/O once CallKit activates AVAudioSession
    Pjsua2Wrapper.sharedInstance()?.enableSoundDevice(true)
}

И, конечно, когда вызов завершен илиустановить на удержание, когда CallKit отвечает provider(_:didDeactivate:), вы снова отключаете звуковое устройство PJSIP, и все

func provider(_ provider: CXProvider, didDeactivate audioSession: AVAudioSession) {
    // Stop call audio IO
    Pjsua2Wrapper.sharedInstance()?.enableSoundDevice(false)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...