简体   繁体   中英

'NSInternalInconsistencyException', reason: 'Killing app because it never posted an incoming call to the system after receiving a PushKit VoIP push

Unable to resolve this issue tried many things. Tried debugging but it keeps showing this error

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Killing app because it never posted an incoming call to the system after receiving a PushKit VoIP push.'

func pushRegistry(_ registry: PKPushRegistry,didReceiveIncomingPushWith payload: PKPushPayload, for type: PKPushType, completion: @escaping () -> Void) {
    let dict = payload.dictionaryPayload
    if let handleDict = dict["handle"] as? NSDictionary {
        self.callDict = handleDict
        
        let config = CXProviderConfiguration(localizedName: "App")
        config.iconTemplateImageData = UIImage(named: "user_circle")!.pngData()
        config.ringtoneSound = "iphoneRingtone.mp3"
        config.includesCallsInRecents = true;
        config.supportsVideo = true;
        
        let callProvider = CXProvider(configuration: config)
        callProvider.setDelegate(self, queue: nil)
        
        let callUpdate = CXCallUpdate()
        let phoneNumber = CXHandle(type: .phoneNumber, value: "SoCircle")
        callUpdate.remoteHandle = phoneNumber
        callUpdate.hasVideo = true
        let callUUID = UUID()
        
        // Report the call to CallKit
        callProvider.reportNewIncomingCall(with: callUUID, update: callUpdate, completion: { (error) in
            completion()
        })
    }
    completion()
}

There are two main reasons why you get that error.

  1. As you may know, you always have to report a new incoming call when receiving a VoIP push. If, for any reason, the value contained in dict["handle"] is nil or is not an NSDictionary , you fail to report a new incoming call and so you get the error.

  2. The completion() should be called only after you successfully reported a new incoming call, so inside the completion handler of reportNewIncomingCall as you've done. The problem is the completion() that you call outside the if . Given that reportNewIncomingCall is an asynchronous method, the completion() outside the if will be called before the reportNewIncomingCall has completed, hence the system will think that you've failed to report a new incoming call. So, just remove the completion() outside the if .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM