如果我们在前台启动应用程序,则一切正常。但是存在一个问题,即该应用程序以前被杀死并通过在锁定屏幕上收到PushKit通知重新启动。
当应用程序收到PushKit通知时,我们将显示CallKit UI。这可以正常工作。用户能够通过WebRTC应答呼叫并建立连接。但是根本没有音频。
奇怪的是,如果用户通过点击应用程序图标从CallKit屏幕打开应用程序,则音频将按预期方式启动并运行。因此看来问题出在音频会话配置上。也许由于某些原因,iOS不允许激活我们的音频会话。
我们正在使用Google的WebRTC库:
pod 'GoogleWebRTC', '1.1.26115'
我们尝试了不同的方法:
启用/禁用音频背景模式。
在从CallKit委托接收到didActivate
回调之前和之后配置音频会话。
手动配置音频会话,并使用WebRTC库中的RTCAudioSession.sharedInstance
。
启用和禁用RTCAudioSession.useManualAudio
。
在这种情况下,我们会遇到此问题:
杀死该应用程序。锁定手机。
从另一部电话呼叫该用户。
PushKit启动应用程序,应用程序显示CallKit屏幕,用户接听电话。
连接正确建立。通话正在进行,但两端都没有声音。
在CallKit屏幕上点击应用程序图标(最右下角),然后解锁手机。音频开始。
感谢您的帮助。
答案 0 :(得分:0)
音频I / O和CallKit
有一个特定的问题。当您即将收到来电时,您必须为VoIP呼叫配置音频会话,但不要激活它,只需设置类别,模式和缓冲区即可。
为CallKit
传入呼叫配置音频会话的示例:
func configureAudioSession() {
let sharedSession = AVAudioSession.sharedInstance()
do {
try sharedSession.setCategory(AVAudioSessionCategoryPlayAndRecord)
try sharedSession.setMode(AVAudioSessionModeVoiceChat)
try sharedSession.setPreferredIOBufferDuration(TimeInterval(0.005))
try sharedSession.setPreferredSampleRate(44100.0)
} catch {
debugPrint("Failed to configure `AVAudioSession`")
}
}
然后,当您接听来电时,CallKit
将为您激活音频会话,并且您会收到来自CXProvider的回叫:
func provider(_ provider: CXProvider, didActivate audioSession: AVAudioSession) {
// Start call audio I/O here
}
在该委托回调中,您应该开始通话音频,而不是之前。如果WebRTC呼叫音频I / O是在之前启动的,则 CallKit将终止它,并且没有声音。