gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 05:32:17 27 4
gpt4 key购买 nike

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

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

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

我们正在使用 Google 的 WebRTC 库:

pod 'GoogleWebRTC',             '1.1.26115'

我们尝试了不同的方法:

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

  2. 在从 CallKit 代理接收到 didActivate 回调之前和之后配置 Audio Session 。

  3. 手动配置 Audio Session 并使用 WebRTC 库中的 RTCAudioSession.sharedInstance

  4. 启用和禁用 RTCAudioSession.useManualAudio

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

  1. 终止应用程序。锁定手机。

  2. 从另一部手机调用此用户。

  3. PushKit 启动应用,应用呈现 CallKit 屏幕,用户接听电话。

  4. 连接正确建立。通话中,但两端没有声音。

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

感谢任何帮助。

最佳答案

音频 I/O 和 CallKit 存在特定问题。当您即将接听来电时,您必须为 VoIP 调用配置 Audio Session ,但不要激活它,只需设置类别、模式和缓冲区即可。

CallKit 来电配置 Audio Session 的示例:

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 会为您激活 Audio Session ,您会收到来自 CXProvider 的回调:

func provider(_ provider: CXProvider, didActivate audioSession: AVAudioSession) {
// Start call audio I/O here
}

在那个委托(delegate)回调中,你应该开始你的通话音频,而不是之前。如果之前启动了 WebRTC 调用音频 I/O,CallKit 将终止它并且不会有声音。

关于swift - 在锁定屏幕上使用 PushKit 和 CallKit 在后台启动应用程序时连接到 WebRTC 后没有声音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55391026/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com