【问题标题】:No sound after connecting to WebRTC when app is launched in background using PushKit and CallKit on the lock screen在锁定屏幕上使用 PushKit 和 CallKit 在后台启动应用程序时连接到 WebRTC 后没有声音
【发布时间】:2019-08-18 20:04:00
【问题描述】:

如果我们在前台启动应用程序,一切正常。但是,当应用程序之前被杀死并通过在锁定屏幕上接收 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 屏幕上的应用程序图标(最右下角)并解锁手机。音频开始。

感谢任何帮助。

【问题讨论】:

  • 您在调用reportNewIncomingCall(with:update:completion:)之前是否尝试过配置音频会话?
  • 可能与以下相同的问题:stackoverflow.com/questions/48070163/… 请检查我的答案
  • 你解决了吗?有完全相同的问题并尝试了所有这些方法,但它没有帮助。

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


【解决方案1】:

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

【讨论】:

  • 屏幕锁定时如何将audioSession焦点赋予webrtc?默认情况下,只有当我解锁屏幕时才会开始输出音频。
  • 我相信func provider(_ provider: didActivate:) 音频会话委托方法会在您接听传入的音频/视频呼叫时被调用。在该回调中,您需要启用音频处理器,在此之前应禁用音频处理器,否则 CallKit 将终止所有正在运行的音频 IO,导致通话期间没有声音
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-20
  • 2018-06-12
  • 2011-12-10
  • 1970-01-01
  • 1970-01-01
  • 2021-06-22
相关资源
最近更新 更多