CallKit - 如何将CXCallController带到前面

Dav*_*eek 0 tokbox swift callkit

我正在创建一个VOIP应用程序.大多数逻辑类似于Raywenderlich教程.

我的问题是,在接受呼叫后,CXCallController它不在应用程序之上,而是在"任务管理器"旁边:

在此输入图像描述

问题是,一旦你接受了呼叫,CXCallController它不是最顶层的控制器,而是实际的应用程序.所以你不能说这个电话正在发生.并执行有关呼叫的操作 - 例如挂断,保持,静音,您将不得不通过任务管理器打开CXCallController.用户不太友好.

CXCallController用户接听电话后如何将其置于前面?

在用户接听电话后调用的提供者代理:

func provider(_ provider: CXProvider, perform action: CXAnswerCallAction) {

    guard let call = callManager.getCall(with: action.callUUID) else {
        action.fail()
        return
    }

    configureAudioSession()
    self.incommingCall = call
    action.fulfill()
}
Run Code Online (Sandbox Code Playgroud)

创建音频会话后的回调:

func provider(_ provider: CXProvider, didActivate audioSession: AVAudioSession) {

    incommingCall?.answerCall(with: audioSession) { success in

        if success {
            self.incommingCall?.startAudio()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

使用TokBox VOIP服务启动调用逻辑:

func answerCall(with audioSession: AVAudioSession, completion: ((_ success: Bool) -> Void)?) {

    OTAudioDeviceManager.setAudioDevice(OTDefaultAudioDevice.sharedInstance(with: audioSession))
    if session == nil {
        session = OTSession(apiKey: self.apiKey, sessionId: self.sessionID, delegate: self)
    }

    answerCallCompletion = completion

    var error: OTError?
    hasStartedConnecting = true
    session?.connect(withToken: self.token, error: &error)

    if error != nil {

        CoreServices.catchError(error: error, at: #function)
    }
}
Run Code Online (Sandbox Code Playgroud)

通话本身运作正常.双方能够通信,开始和结束通话.唯一的问题是所描述的CXCallController行为.

这是预期的行为吗?或者我如何把它CXCallController带到前面?非常感谢帮助.

RJV*_*mar 7

这是callkit的预期行为.当应用程序接收来电时,Callkit允许我们接听或拒绝来电.在接听电话后,应用必须管理所有操作.

  • 当手机被锁定时,接收来电,CXCallController将会可见,在接听电话后,您仍然可以看到CXCallController处于锁定模式.解锁手机后,CXCallController将不可见,应用程序必须管理挂断,静音或保持选项.
  • 当手机未锁定时,接收来电,CXCallController将可见,在接听电话后,CXCallController将不可见,应用程序必须管理挂断,静音或保持选项.