gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 01:49:41 25 4
gpt4 key购买 nike

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

After the call is connected, the system calls the provider(_:perform:) method of the provider delegate. In your implementation, the delegate is responsible for configuring an AVAudioSession and calling fulfill() on the action when finished.

和代码片段:

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

关于 fulfill() 方法:

You should only call this method from the implementation of a CXProviderDelegate method.

据我了解,我们应该在被叫方接受调用后立即调用 action.fulfill()。

问题:当设备被锁定时,原生 CallKit 屏幕上的通话计时器开始计时,但尚未建立连接。

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

最佳答案

希望你在这个委托(delegate)回调中调用应答逻辑

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

当然,当通话结束或暂停时,当 CallKit 响应 provider(_:didDeactivate:) 时,您再次禁用 PJSIP 声音设备,这就是它

func provider(_ provider: CXProvider, didDeactivate audioSession: AVAudioSession) {
// Stop call audio IO
Pjsua2Wrapper.sharedInstance()?.enableSoundDevice(false)
}

关于ios - 通话计时器在被叫方接听电话后立即开始计时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55417042/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com