3

如果我们在前台启动应用程序,一切正常。但是,当应用程序先前被杀死并通过在锁定屏幕上接收 PushKit 通知重新启动时,就会出现问题。

当应用收到 PushKit 通知时,我们会显示 CallKit UI。这可以正常工作。用户可以通过 WebRTC 接听电话并建立连接。但是根本没有音频。

奇怪的是,如果用户通过点击应用程序图标从 CallKit 屏幕打开应用程序,音频会按预期启动并正常工作。所以看起来问题出在音频会话配置上。也许出于某种原因,iOS 不允许激活我们的音频会话。

我们正在使用 Google 的 WebRTC 库:

pod 'GoogleWebRTC',             '1.1.26115'

我们尝试了不同的方法:

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

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

  3. 手动配置音频会话并使用RTCAudioSession.sharedInstanceWebRTC 库。

  4. 启用和禁用RTCAudioSession.useManualAudio.

这是我们遇到问题的场景:

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

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

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

  4. 连接正确建立。通话处于活动状态,但两端没有声音。

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

任何帮助表示赞赏。

4

1 回答 1

3

音频 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 将终止它并且不会有声音。

于 2019-03-28T09:14:36.737 回答