Ожидается, что вы вызываете логику ответа в этом обратном вызове делегата.
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)
}