被叫方接听电话后,通话计时器立即开始计时

时间:2019-03-29 12:02:33

标签: ios swift webrtc voip callkit

我正在将呼叫集成到我的应用中。在CallKit文档https://developer.apple.com/documentation/callkit中,有一个文本:

  

连接呼叫后,系统将调用提供者委托的provider(_:perform :)方法。在您的实现中,委托负责配置AVAudioSession并在操作完成时调用该操作的

和代码段:

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

关于 fulfill()方法:

  

您应仅从CXProviderDelegate方法的实现中调用此方法。

据我所知,被叫方接受呼叫后,我们应立即调用action.fulfill()。

问题:锁定设备后,本机CallKit屏幕上的呼叫计时器开始计数,但尚未建立连接。

问题:建立连接后,如何在锁定的CallKit屏幕上调用action.fulfill()或启动计时器。我可以通过某种方式在锁定屏幕上控制此计时器标签吗?

1 个答案:

答案 0 :(得分:1)

期望您在此委托回调中调用应答逻辑

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()
        }
    })
}

应答完成后将调用应答呼叫的完成处理程序,因此计时器将在连接呼叫后启动。

编辑

PJSIP的声音问题

如果使用PJSIP,则需要在初始化PJSIP时停止音频I / O,就像这样(它是C ++):

enableSoundDevice( false );

当接听电话时,CallKit将以功能provider(_: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)
}