当前位置: 首页 > 知识库问答 >
问题:

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

曹恩
2023-03-14

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

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

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

我们正在使用谷歌的WebRTC库:

pod 'GoogleWebRTC',             '1.1.26115'

我们尝试了不同的方法

>

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

手动配置音频会话并使用RTCAdioSession。来自WebRTC库的sharedInstance

启用和禁用RTCAdioSession。使用手动音频

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

>

  • 关闭应用程序。锁上电话。

    从其他电话呼叫此用户。

    PushKit启动应用程序,应用程序呈现CallKit屏幕,用户接听呼叫。

    连接建立正确。呼叫处于活动状态,但两端没有声音。

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

    感谢您的帮助。

  • 共有1个答案

    司徒隐水
    2023-03-14

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

     类似资料:
    • 我试图让callkit在传入呼叫时与webrtc一起工作,但当我从锁定屏幕接收呼叫并接受它时,在我以前台模式运行应用程序之前,不会有声音。我已配置audiosession向RTCAudoSession发送通知,但它不起作用。你有解决办法吗?

    • 我们的项目使用WebRTC进行VOIP呼叫,并且在访问CallKit框架之前运行良好。但是当我试图访问CallKit框架时,出现了双方都听不到对方讲话的情况。当我删除CallKit时,一切恢复正常。 CallKit的应答按钮与项目中的原始应答按钮功能相同。 令我惊讶的是,没有必要听到任何声音。有时一切正常,但有时会有问题。嗯,出现问题的可能性更大。 此外,我很好奇套接字不稳定是否会导致CallKi

    • 我在这里尝试了许多解决方案,但没有人奏效。WebRTC工作正常,我在设备锁定时接听电话时处于连接状态,解锁后音频打开,视频启动。当屏幕保持锁定状态时,我如何只能获得音频? 我已启用RTCAdioSession,并在呼叫停止时将其禁用。 当设备第一次解锁时,它工作得很好,当我把它锁回去时,我得到了音频。但是第一次,当我接听来自CallKit的电话时,它不起作用。它只在设备解锁后才开始工作。

    • 问题内容: 我想构建一个锁屏更换应用程序。有什么方法可以创建一个侦听器/服务,该监听器/服务将在用户唤醒/解锁屏幕时启动我的应用程序? 问题答案: 请参阅mylockforandroid的源代码, 您将需要使用DeviceAdminReceiver来禁用默认的Android 屏幕锁。 当用户解锁屏幕将and 注册为时启动活动: 将此代码添加到manifast.xml中,将ScreenReceive

    • 那么当屏幕被锁定时,是否有任何方法显示特定的XAML页面。目前我正在使用toast通知来完成此操作。但是toast通知的问题是我对UI没有太多的控制。

    • 我正在试验的Android信标库,我能够使其工作与苹果兼容的信标监测和测距添加自定义解析器(请参阅这是正确的布局,以检测iBeacons与AltBeacon的Android信标库?) 现在我正在尝试使用此处显示的示例代码编写一个在后台启动的应用程序: http://altbeacon.github.io/android-beacon-library/samples.html 这是我的代码: 不幸的