我在我的应用程序中集成了调用。在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屏幕上启动计时器。我能以某种方式控制锁定屏幕上的这个计时器标签吗?
期望您在此委托回调中调用应答逻辑
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)
}