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

CallKit WebRTC:在iOS中按下锁定/电源按钮时,CallKit呼叫断开

麻宾白
2023-03-14

这是一个会议应用程序,我正在启动传出呼叫,以使我的VoIP呼叫具有高优先级,并且在我进行VoIP呼叫时不会中断传入呼叫。

我在我的应用程序中使用WebRTC CallKit。我开始了一个呼叫,当我按下锁定/电源按钮,然后CallKit呼叫断开,我的Voip呼叫音频路由更改为接收器并保持不变。

为什么要锁定iPhone以终止通话。

这是我的代码。

 var callUUID: UUID?

extension AppDelegate {
    func initiateCallKitCall() {
        let config = CXProviderConfiguration(localizedName: "AppName")
        config.includesCallsInRecents = false;
        config.supportsVideo = true;
        config.maximumCallsPerCallGroup = 1
        provider = CXProvider(configuration: config)
        guard let provider = provider else { return }
        provider.setDelegate(self, queue: nil)
        callController = CXCallController()
        guard let callController = callController else { return }
        callUUID = UUID()
        let transaction = CXTransaction(action: CXStartCallAction(call: callUUID!, handle: CXHandle(type: .generic, value: "AppName")))
        callController.request(transaction, completion: { error in
            print("Error is : \(String(describing: error))")
        })

    }

    func endCallKitCall(userEnded: Bool) {
        self.userEnded = userEnded
        guard provider != nil else { return }
        guard let callController = callController else { return }
        if let uuid = callUUID {
            let endCallAction = CXEndCallAction(call: uuid)
            callController.request(
                CXTransaction(action: endCallAction),
                completion: { error in
                    if let error = error {
                        print("Error: \(error)")
                    } else {
                        print("Success")
                    }
                })
        }
    }

    func isCallGoing() -> Bool {
        let callController = CXCallController()
        if callController.callObserver.calls.count != 0 {
            return true
        }
        return false
    }
}

extension AppDelegate: CXProviderDelegate {

    func providerDidReset(_ provider: CXProvider) {
        print("-Provider-providerDidReset")
    }

    func provider(_ provider: CXProvider, perform action: CXAnswerCallAction) {
        print("-Provider-perform action: CXAnswerCallAction")
        action.fulfill()
    }

    func provider(_ provider: CXProvider, perform action: CXEndCallAction) {
        action.fulfill()
        print("-Provider: End Call")
    }

    func provider(_ provider: CXProvider, perform action: CXStartCallAction) {
        action.fulfill()

        DispatchQueue.main.asyncAfter(wallDeadline: DispatchWallTime.now() + 3) {
            provider.reportOutgoingCall(with: action.callUUID, startedConnectingAt: Date())
            DispatchQueue.main.asyncAfter(wallDeadline: DispatchWallTime.now() + 1.5) {
                provider.reportOutgoingCall(with: action.callUUID, connectedAt: Date())
            }
        }
    }

    func provider(_ provider: CXProvider, perform action: CXSetHeldCallAction) {
        action.fulfill()
    }

    func provider(_ provider: CXProvider, didActivate audioSession: AVAudioSession) {
        RTCAudioSession.sharedInstance().audioSessionDidActivate(audioSession)
        RTCAudioSession.sharedInstance().isAudioEnabled = true
    }

    func provider(_ provider: CXProvider, didDeactivate audioSession: AVAudioSession) {
        RTCAudioSession.sharedInstance().audioSessionDidDeactivate(audioSession)
        RTCAudioSession.sharedInstance().isAudioEnabled = false
    }
}

共有2个答案

危斯伯
2023-03-14

我想在这里回答所有与CallKit相关的问题。我的问题的答案是:

您需要设置音频会话模式。默认后,您的voip呼叫建立成功。

try AVAudioSession.sharedInstance().setMode(.default)
AudioRouteManager.shared.fourceRouteAudioToSpeakers()
冯敏达
2023-03-14

当且仅当通话通过屏幕顶部的内置扬声器(接收器)进行时,电源按钮才会结束通话。在任何其他情况下(即通过耳机、蓝牙或内置扬声器播放音频),电源按钮不会结束通话。

本地电话也是如此。

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

  • 问题内容: 下面的代码正确返回该单元格: 但是在表视图中查找indexpath会崩溃: 我尝试了另一种方法,但是没有成功: 问题答案: 我不知道是否有简单的方法可以做到这一点。( 编辑: 实际上有。请查看@mustafa的第二个解决方案。)一种解决方法是将按钮的标签设置为in ,然后可以仅访问按钮的标签以找出按钮所属的行。 警告: 此解决方法很脆弱。如果您允许在不调用的情况下从表中添加或删除行,则

  • 在我的Android应用程序中,我有一个带有几个按钮的导航抽屉,这些按钮可以打开具有相关布局的不同片段。 其中一个按钮应该调用理论上应该执行电话拨号的功能。好像就是不行。什么也没有发生,导航抽屉只是关闭。我已经在清单中实现了这个权限,它应该可以完成权限方面的工作: 我的代码根据导航抽屉中的按钮事件执行代码段,如下所示: 最后但并非最不重要的一点是,执行电话呼叫的功能如下所示;我必须指出,如果我没有

  • 我是开发Android应用程序的新手,我想做的是创建一个可以读取电源按钮按下时间的应用程序,以制作一个可访问性应用程序。 也许如果我能控制或计算屏幕打开和屏幕关闭事件,这可能会有所帮助。

  • 我是Android新手。我正在尝试制作一个应用程序,它将在后台运行,并检测三次快速按下电源按钮。我查阅了很多资料,但无法澄清我的困惑。谁能给我一些建议吗?蒂亚。