在锁定屏幕上使用PushKit和CallKit在后台启动应用程序时,连接到WebRTC后无声音

时间:2019-03-28 05:59:03

标签: swift webrtc callkit pushkit ios-background-mode

如果我们在前台启动应用程序,则一切正常。但是存在一个问题,即该应用程序以前被杀死并通过在锁定屏幕上收到PushKit通知重新启动。

当应用程序收到PushKit通知时,我们将显示CallKit UI。这可以正常工作。用户能够通过WebRTC应答呼叫并建立连接。但是根本没有音频。

奇怪的是,如果用户通过点击应用程序图标从CallKit屏幕打开应用程序,则音频将按预期方式启动并运行。因此看来问题出在音频会话配置上。也许由于某些原因,iOS不允许激活我们的音频会话。

我们正在使用Google的WebRTC库:

pod 'GoogleWebRTC',             '1.1.26115'

我们尝试了不同的方法:

  1. 启用/禁用音频背景模式。

  2. 在从CallKit委托接收到didActivate回调之前和之后配置音频会话。

  3. 手动配置音频会话,并使用WebRTC库中的RTCAudioSession.sharedInstance

  4. 启用和禁用RTCAudioSession.useManualAudio

在这种情况下,我们会遇到此问题:

  1. 杀死该应用程序。锁定手机。

  2. 从另一部电话呼叫该用户。

  3. PushKit启动应用程序,应用程序显示CallKit屏幕,用户接听电话。

  4. 连接正确建立。通话正在进行,但两端都没有声音。

  5. 在CallKit屏幕上点击应用程序图标(最右下角),然后解锁手机。音频开始。

感谢您的帮助。

1 个答案:

答案 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将终止它,并且没有声音。