其他用户结束 gsm 通话后,VoIP 通话无法使用音频

问题描述 投票:0回答:1

我正在研究音频/视频通话的实现,它工作正常。所以现在我正在研究当我的 voip 呼叫被 gsm 呼叫中断时的场景。当我收到任何 gsm 呼叫时,我会在 callkit 中看到“结束/应答”和“保持/接受”选项。因此,当我选择“保持/接受”选项时,我的呼叫将通过调用 CXSetHeldCallAction mwthod 并暂停/静音我的音频/视频来保持,同时 iOS 通过调用 didDeactivate audioSession 方法来停用音频会话,这是预期的行为。

现在,如果我通过点击 callkit 中的结束通话按钮来结束 gsm 通话,我的音频会话将自动激活,并且我也会恢复我的视频和音频。但如果另一个用户结束通话并且没有激活音频会话,则不会发生同样的情况,因此在这种情况下音频无法工作。

我检查了不同的堆栈溢出答案并尝试了一切可能的方法,但仍然无法找出解决方案。我什至尝试手动激活会话,但出现会话激活失败错误。因此,如果有人遇到同样的问题并解决了该问题,请给我一个想法,我该怎么做。

ios voip avaudiosession
1个回答
0
投票

经过几个小时的调试,我能够解决这个问题。我已经实现了 CXCallObserver 委托 callChanged,我在 voip 呼叫 ID 的帮助下检查另一个呼叫是否结束。如果另一个通话结束,我会调用 CXSetHeldCallAction 取消保留我的 voip 通话,这样音频会话就会自动恢复。

 func callObserver(_ callObserver: CXCallObserver, callChanged call: CXCall) {
    guard let callId = currentCallId else { return }
    if call.uuid != callId && call.hasEnded {
        let callController = CXCallController()
        let update = CXCallUpdate()
        let endCallAction = CXSetHeldCallAction(call: callId, onHold: false)
        callController.request(
            CXTransaction(action: endCallAction),
            completion: { error in
                if let error = error {
                    debugPrint("call unheld Error: \(error.localizedDescription)")
                } else {
                    debugPrint("call unheld Success")
                    //restore original video and mute status of call.
                    CallManager.shared.isShowVideo = self.originalIsShowVideoStatus
                    CallManager.shared.isMuteAudio = self.originalIsMuteAudioStatus
                    self.provider?.reportCall(with: callId, updated: update)
                }
            })
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.