CallKit - 如何将 CXCallController 置于最前面
CallKit - How to bring the CXCallController to the front
我正在创建一个 VOIP 应用程序。
大多数逻辑类似于 Raywenderlich Tutorial.
我的问题是,接听电话后,CXCallController
不在应用程序的顶部,而是在"task manager"的旁边:
问题在于,一旦您接受了呼叫,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()
}
创建音频会话后的回调:
func provider(_ provider: CXProvider, didActivate audioSession: AVAudioSession) {
incommingCall?.answerCall(with: audioSession) { success in
if success {
self.incommingCall?.startAudio()
}
}
}
使用 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)
}
}
调用本身工作正常。两方能够通信、开始和结束通话。唯一的问题是所描述的 CXCallController
行为。
这是预期的行为吗?或者如何将 CXCallController
置于最前面?
非常感谢帮助。
这是 callkit 的预期行为。 Callkit 允许我们在应用程序收到来电时接听或拒绝来电。接听电话后,应用程序必须管理所有操作。
- 当phone被锁定时,收到来电,CXCallController可见,接听电话后,您仍然可以在锁定模式下看到 CXCallController。解锁 phone 后,CXCallController 将不可见,应用程序必须管理挂断、静音或保持选项。
- 当phone未锁定时,收到来电,接听电话后CXCallController可见 ,CXCallController 将不可见,应用程序必须管理挂断、静音或保持选项。
我正在创建一个 VOIP 应用程序。 大多数逻辑类似于 Raywenderlich Tutorial.
我的问题是,接听电话后,CXCallController
不在应用程序的顶部,而是在"task manager"的旁边:
问题在于,一旦您接受了呼叫,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()
}
创建音频会话后的回调:
func provider(_ provider: CXProvider, didActivate audioSession: AVAudioSession) {
incommingCall?.answerCall(with: audioSession) { success in
if success {
self.incommingCall?.startAudio()
}
}
}
使用 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)
}
}
调用本身工作正常。两方能够通信、开始和结束通话。唯一的问题是所描述的 CXCallController
行为。
这是预期的行为吗?或者如何将 CXCallController
置于最前面?
非常感谢帮助。
这是 callkit 的预期行为。 Callkit 允许我们在应用程序收到来电时接听或拒绝来电。接听电话后,应用程序必须管理所有操作。
- 当phone被锁定时,收到来电,CXCallController可见,接听电话后,您仍然可以在锁定模式下看到 CXCallController。解锁 phone 后,CXCallController 将不可见,应用程序必须管理挂断、静音或保持选项。
- 当phone未锁定时,收到来电,接听电话后CXCallController可见 ,CXCallController 将不可见,应用程序必须管理挂断、静音或保持选项。