我正在将呼叫集成到我的应用中。在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()或启动计时器。我可以通过某种方式在锁定屏幕上控制此计时器标签吗?
答案 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)
}