Я создаю приложение VOIP.
Большая часть логики похожа на Raywenderlich Tutorial .
Моя проблема в том, что после принятия вызова CXCallController
находится не поверх Приложения, а рядом с ним в «диспетчере задач»:
Проблема в том, что после того, как вы приняли вызов, CXCallController
является не самым верхним контроллером, а настоящим приложением.
Таким образом, вы не можете сказать, что звонок происходит.
И для выполнения действий, связанных с вызовом - например, повесить трубку, удерживать, отключить звук, вам придется пройти через диспетчер задач, чтобы открыть CXCallController
. Не очень удобно.
Как вывести CXCallController
на фронт после того, как пользователь принял вызов?
Делегат поставщика звонил после того, как пользователь ответил на звонок:
func provider(_ provider: CXProvider, perform action: CXAnswerCallAction) {
guard let call = callManager.getCall(with: action.callUUID) else {
action.fail()
return
}
configureAudioSession()
self.incommingCall = call
action.fulfill()
}
Обратный вызов после создания аудиосеанса:
func provider(_ provider: CXProvider, didActivate audioSession: AVAudioSession) {
incommingCall?.answerCall(with: audioSession) { success in
if success {
self.incommingCall?.startAudio()
}
}
}
Запустить логику вызова с помощью TokBox VOIP Service:
func answerCall(with audioSession: AVAudioSession, completion: ((_ success: Bool) -> Void)?) {
OTAudioDeviceManager.setAudioDevice(OTDefaultAudioDevice.sharedInstance(with: audioSession))
if session == nil {
session = OTSession(apiKey: self.apiKey, sessionId: self.sessionID, delegate: self)
}
answerCallCompletion = completion
var error: OTError?
hasStartedConnecting = true
session?.connect(withToken: self.token, error: &error)
if error != nil {
CoreServices.catchError(error: error, at: #function)
}
}
Сам звонок работает нормально. Две стороны могут общаться, начинать и завершать звонки. Единственная проблема - описанное поведение CXCallController
.
Это ожидаемое поведение? Или как вывести CXCallController
на фронт?
Помощь очень ценится.