在 CallKit 文档https://developer.apple.com/documentation/callkit有一个文本:
连接调用后,系统将调用提供程序委托的 provider (_:perform:) 方法。在您的实现中,委托负责配置 AudioSession 并在完成时对操作调用 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()
}
})
}
应答完成时调用应答调用的完成处理程序,因此计时器将在连接呼叫时启动。
EDITPJSIP 的声音问题
如果使用 PJSIP,则需要在初始化 PJSIP 时停止音频 I / O,就像这样(它是 C ++):
enableSoundDevice( false );
And when call is answered,CallKit
will respond with funcprovider(_:didActivate:)
.That is where you need to activate the PJSIP sound device in order to have the sound.
这是我的代码中的示例:
func provider(_ provider: CXProvider, didActivate audioSession: AudioSession) {
// Start call audio I/O once CallKit activates AudioSession
Pjsua2Wrapper.sharedInstance()?.enableSoundDevice(true)
}
而且,当然,当呼叫结束或设置为保持时,当CallKit
以provider(_:didDeactivate:)
响应时,您将再次禁用 PJSIP 声音设备,仅此而已
func provider(_ provider: CXProvider, didDeactivate audioSession: AudioSession) {
// Stop call audio IO
Pjsua2Wrapper.sharedInstance()?.enableSoundDevice(false)
}
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(28条)