VOIP 通知丢失或延迟

VOIP notification is being missing or delay

我怎么知道我的设备被阻止接收 VoIP 通知?

应用程序在收到 3-4 次后停止接收 VoIP 通知。我了解到,从 iOS 起,应该向 CallKit 报告 13 个 VoIP 通知。即使在向 CallKit 报告后,我仍在经历收不到 VoIP 通知的问题。

我们已将 apns-expiration 设置为 0,并将优先级设置为立即 (10)。

func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, for type: PKPushType, completion: @escaping () -> Void) {
        dictPayload = payload.dictionaryPayload[K.KEY.APS] as? [String : Any]
        if dictPayload![K.KEY.ALERTTYPE] as? String == K.KEY.VOIPCALL {
            self.displayIncomingCall(uuid: appDelegate.uudiForCall, handle: (self.dictPayload!["handle"] as? String)!) { (error) in
            }
            CallProviderDelegate.sharedInstance.callDidReceiveIncomingCallfromKill(callInfo: self.dictPayload!)
        } else if dictPayload![K.KEY.ALERTTYPE] as? String == K.KEY.PUSHTOTALK {
            isPTTON = true
            pjsua_set_no_snd_dev()
            CallHandler.sharedCallManager()?.muteCall(true)
            CallHandler.sharedCallManager()?.setAudioSessionSpeaker()
            CallProviderDelegate.sharedInstance.callDidReceivePTTFromKIll(callFromName: dictPayload!["title"]  as? String, callfromExt: dictPayload![K.KEY.BODY] as? String)
        } else if dictPayload![K.KEY.ALERTTYPE] as? String == K.KEY.HANGUP {
            isPTTON = false
            CallProviderDelegate.sharedInstance.endCallFromPTT(endCallUDID: appDelegate.uudiForCall)
        }
    }


func displayIncomingCall(
        uuid: UUID,
        handle: String,
        hasVideo: Bool = false,
        completion: ((Error?) -> Void)?
    ) {
        let update = CXCallUpdate()
        update.remoteHandle = CXHandle(type: .phoneNumber, value:(handle))
        CallProviderDelegate.sharedInstance.provider.reportNewIncomingCall(with: uuid, update: update, completion: { error in })
    }

XCODE: 11.3.1, SWIFT: 4.2 & iOS: 13.0 +

自过去 2 个月以来,我一直在努力解决这个问题,但未能解决。请帮助我

提前致谢。

实际上,您似乎并没有为每个 VoIP 推送通知报告新的来电。确实,当有活动的 CallKit 呼叫时,您可以接收 VoIP 推送而无需报告新的来电,但这并不像看起来那么简单。由于 CallKit 和 PushKit 是异步的,因此无法保证当您收到 K.KEY.PUSHTOTALKK.KEY.HANGUP 类型的推送时,调用已经开始。另外,如果dictPayload为nil,则表示没有新来电上报。

无论如何,我认为您的代码中最大的问题是您没有调用 pushRegistry(:didReceiveIncomingPushWith...) 方法的完成处理程序。您应该执行以下操作:

self.displayIncomingCall(uuid: appDelegate.uudiForCall, handle: (self.dictPayload!["handle"] as? String)!) { (error) in
    completion() // <---
}

CallProviderDelegate.sharedInstance.provider.reportNewIncomingCall(with: uuid, update: update, completion: { error in
    completion()
})
// or
CallProviderDelegate.sharedInstance.provider.reportNewIncomingCall(with: uuid, update: update, completion: completion)