I have been having a problem in our application while handling the VoIP notifications.
sometimes the didReceiveIncomingPushWith delegate function is invoked when a VoIP Notif is sent but when the call is accepted nothing happened from the caller's side, like the callback to the caller to notify him that the call is accepted doesn't happe.
And sometimes the didReceiveIncomingPushWith is not even invoked when a VoIP notif is sent.
here is a potion of the code.
func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, for type: PKPushType, completion: @escaping () -> Void) {
NSLog("pushRegistry didReceiveIncomingPushWith() type:(type)")
// Handle the push payload
if let pushHashtable = payload.dictionaryPayload["aps"] as? [AnyHashable: Any] {
if let pushMessage = pushHashtable["alert"] as? String {
NSLog("push message=\(pushMessage)")
}
}
if type == PKPushType.voIP {
// Process the received push: if it is a VoIP push, this must be an incoming call because we deactivated push for REGISTER refresh from Kamailio server
if SipService.instance?.currentCall != nil {
// A call is already going on, ignore this VoIP push
NSLog("pushRegistry - voip push, and we already have a currentCall: we already received the INVITE, or it is a voip push for another call -> let's ignore it")
completion()
return
}
// We want to send a REGISTER anyway to get the pending INVITE message.
// Then, the incoming call will be notified in the SIP stack onCallNew(_ call: Call!) callback
// Since iOS 13, it is mandatory to report an incoming call immediately after a Voip push
// instead of waiting for the SIP INVITE (in EngineDelegate.onCallNew())
// See details here: https://forums.developer.apple.com/message/376630#376630
NSLog("pushRegistry - >= iOS 13 -> showing callkit before SIP INVITE")
if let callerSipUri = payload.dictionaryPayload["caller-sip-uri"] as? String {
NSLog("push caller-sip-uri=\(String(describing: callerSipUri))")
SipUtils.findCallerName(fromSip: callerSipUri) { callerName in
let customCallerName = (callerName ?? "Inconnu") + (CallKitService.instance?.CALLKIT_DEBUG_MODE == true ? " [PUSH]" : "")
DispatchQueue.main.async {
CallKitService.instance?.reportNewIncomingCallToCallKit(callerName: customCallerName) {
completion()
}
}
}
} else {
// That should not happen: Kamailio server is supposed to add the caller SIP URI in the VoIP push
DispatchQueue.main.async {
CallKitService.instance?.reportNewIncomingCallToCallKit(callerName: nil) {
completion()
}
}
}
// No call is going on, so we want to take this call, so we want to send a REGISTER if needed
SipNetworkMonitoring.instance.start()
} else {
NSLog("pushRegistry - not a VoIP push")
completion()
}
}
here is the reportNewIncomingCallToCallKit function implementation
func reportNewIncomingCallToCallKit(callerName: String?, completion: @escaping () -> Void) {
NSLog("Callkit - reportNewIncomingCallToCallKit from %@", callerName ?? "Inconnu")
let update = CXCallUpdate()
update.remoteHandle = CXHandle(type: .generic, value: callerName ?? "Inconnu")
update.hasVideo = true
// we may already have reported a new call to CallKit
// (since iOS13, we must do it in the didReceiveIncomingPushWith() callback)
// In this case, the CallKit UI is already showing with caller="Inconnu": we will update it with the caller name.
if let currentUuid = currentUuid {
NSLog("Callkit - already a CallKit call showing -> updating the existing call ...")
self.cxProvider?.reportCall(with: currentUuid, updated: update)
} else {
NSLog("Callkit - now CallKit call showing -> new call ...")
let newUuid = UUID()
self.currentUuid = newUuid
self.cxProvider?.reportNewIncomingCall(with: newUuid, update: update) { error in
completion()
}
}
// dont configure audioSession here, wait for the Callkit "didActivate audioSession" callback
}
just to clarify : findCallerName is a function to get the called name from a list from the Backend with an escaping closure, (I tried to overpass that function and just give a default name to the caller but still same problem) .
ANY HELP PLEASE?