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

问题描述 投票:2回答:1

我在我的应用程序中集成了调用。在CallKit文档https://developer.apple.com/documentation/callkit中有一个文本:

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

和代码片段:

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

而关于fulfill()方法:

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

据我所知,我们应该在被叫者接听电话后立即调用action.fulfill()。

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

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

ios swift webrtc voip callkit
1个回答
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将回应func provider(_:didActivate:)。这是您需要激活PJSIP声音设备以获得声音的地方。

这是我的代码中的示例:

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

并且,当然,当呼叫结束或设置保持时,当CallKitprovider(_:didDeactivate:)响应时,你再次禁用PJSIP声音设备,那就是它

func provider(_ provider: CXProvider, didDeactivate audioSession: AVAudioSession) {
    // Stop call audio IO
    Pjsua2Wrapper.sharedInstance()?.enableSoundDevice(false)
}
© www.soinside.com 2019 - 2024. All rights reserved.