@@ -2,6 +2,30 @@ import PushKit
22
33fileprivate let voipAppDelegateLogTag = " RocketChat.AppDelegate+Voip "
44
5+ /// Shared CallKit reporting for VoIP PushKit payloads (`handle` and `localizedCallerName` may differ; often both are the caller display name).
6+ fileprivate func reportVoipIncomingCallToCallKit(
7+ callUUID: String ,
8+ handle: String ,
9+ localizedCallerName: String ,
10+ payload: [ AnyHashable : Any ] ,
11+ onReportComplete: @escaping ( ) -> Void
12+ ) {
13+ RNCallKeep . reportNewIncomingCall (
14+ callUUID,
15+ handle: handle,
16+ handleType: " generic " ,
17+ hasVideo: false ,
18+ localizedCallerName: localizedCallerName,
19+ supportsHolding: true ,
20+ supportsDTMF: true ,
21+ supportsGrouping: false ,
22+ supportsUngrouping: false ,
23+ fromPushKit: true ,
24+ payload: payload,
25+ withCompletionHandler: onReportComplete
26+ )
27+ }
28+
529// MARK: - PKPushRegistryDelegate
630
731extension AppDelegate : PKPushRegistryDelegate {
@@ -22,11 +46,26 @@ extension AppDelegate: PKPushRegistryDelegate {
2246 public func pushRegistry( _ registry: PKPushRegistry , didReceiveIncomingPushWith payload: PKPushPayload , for type: PKPushType , completion: @escaping ( ) -> Void ) {
2347 let payloadDict = payload. dictionaryPayload
2448
49+ /// PushKit requires reporting to CallKit before `completion()`. For expired or unparseable payloads,
50+ /// report a short-lived incoming call and end it so the system is not left without a CallKit update.
51+ let reportPlaceholderCallAndEnd : ( _ callUUID: String , _ displayName: String ) -> Void = { callUUID, displayName in
52+ reportVoipIncomingCallToCallKit (
53+ callUUID: callUUID,
54+ handle: displayName,
55+ localizedCallerName: displayName,
56+ payload: payloadDict,
57+ onReportComplete: {
58+ RNCallKeep . endCall ( withUUID: callUUID, reason: 1 )
59+ completion ( )
60+ }
61+ )
62+ }
63+
2564 guard let voipPayload = VoipPayload . fromDictionary ( payloadDict) else {
2665 #if DEBUG
2766 print ( " [ \( voipAppDelegateLogTag) ] Failed to parse incoming VoIP payload: \( payloadDict) " )
2867 #endif
29- completion ( )
68+ reportPlaceholderCallAndEnd ( UUID ( ) . uuidString , " Rocket.Chat " )
3069 return
3170 }
3271
@@ -36,26 +75,18 @@ extension AppDelegate: PKPushRegistryDelegate {
3675 #if DEBUG
3776 print ( " [ \( voipAppDelegateLogTag) ] Skipping expired or invalid VoIP payload for callId: \( callId) : \( voipPayload) " )
3877 #endif
39- completion ( )
78+ reportPlaceholderCallAndEnd ( callId , caller )
4079 return
4180 }
4281
4382 VoipService . prepareIncomingCall ( voipPayload, storeEventsForJs: true )
4483
45- RNCallKeep . reportNewIncomingCall (
46- callId,
84+ reportVoipIncomingCallToCallKit (
85+ callUUID : callId,
4786 handle: caller,
48- handleType: " generic " ,
49- hasVideo: false ,
5087 localizedCallerName: caller,
51- supportsHolding: true ,
52- supportsDTMF: true ,
53- supportsGrouping: false ,
54- supportsUngrouping: false ,
55- fromPushKit: true ,
5688 payload: payloadDict,
57- withCompletionHandler : { }
89+ onReportComplete : { completion ( ) }
5890 )
59- completion ( )
6091 }
6192}
0 commit comments