From 1ff46fe25fe3b0b7a74b55853c6f7f0c2015cb2b Mon Sep 17 00:00:00 2001 From: Danmei Chen Date: Fri, 30 Oct 2020 16:37:50 +0100 Subject: [PATCH] terminate callkit when register failed or cleared --- Classes/CallManager.swift | 13 +++++++++++++ Classes/ProviderDelegate.swift | 8 ++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/Classes/CallManager.swift b/Classes/CallManager.swift index 540cfa98a..2c31508a1 100644 --- a/Classes/CallManager.swift +++ b/Classes/CallManager.swift @@ -46,6 +46,7 @@ import AVFoundation @objc var alreadyRegisteredForNotification: Bool = false var referedFromCall: String? var referedToCall: String? + var endCallkit: Bool = false fileprivate override init() { @@ -400,6 +401,18 @@ import AVFoundation class CoreManagerDelegate: CoreDelegate { static var speaker_already_enabled : Bool = false + + override func onRegistrationStateChanged(lc: Core, cfg: ProxyConfig, cstate: RegistrationState, message: String) { + if lc.proxyConfigList.count == 1 && (cstate == .Failed || cstate == .Cleared){ + // terminate callkit immediately when registration failed or cleared, supporting single proxy configuration + CallManager.instance().endCallkit = true + for call in CallManager.instance().providerDelegate.uuids { + CallManager.instance().providerDelegate.endCall(uuid: call.value) + } + } else { + CallManager.instance().endCallkit = false + } + } override func onCallStateChanged(lc: Core, call: Call, cstate: Call.State, message: String) { let addr = call.remoteAddress; diff --git a/Classes/ProviderDelegate.swift b/Classes/ProviderDelegate.swift index a3b40216d..6e11a063c 100644 --- a/Classes/ProviderDelegate.swift +++ b/Classes/ProviderDelegate.swift @@ -89,7 +89,11 @@ class ProviderDelegate: NSObject { Log.directLog(BCTBX_LOG_MESSAGE, text: "CallKit: report new incoming call with call-id: [\(String(describing: callId))] and UUID: [\(uuid.description)]") provider.reportNewIncomingCall(with: uuid, update: update) { error in if error == nil { - CallManager.instance().providerDelegate.endCallNotExist(uuid: uuid, timeout: .now() + 20) + if CallManager.instance().endCallkit { + CallManager.instance().providerDelegate.endCall(uuid: uuid) + } else { + CallManager.instance().providerDelegate.endCallNotExist(uuid: uuid, timeout: .now() + 20) + } } else { Log.directLog(BCTBX_LOG_ERROR, text: "CallKit: cannot complete incoming call with call-id: [\(String(describing: callId))] and UUID: [\(uuid.description)] from [\(handle)] caused by [\(error!.localizedDescription)]") let code = (error as NSError?)?.code @@ -124,7 +128,7 @@ class ProviderDelegate: NSObject { } func endCall(uuid: UUID) { - provider.reportCall(with: uuid, endedAt: .init(), reason: .declinedElsewhere) + provider.reportCall(with: uuid, endedAt: .init(), reason: .failed) } func endCallNotExist(uuid: UUID, timeout: DispatchTime) {