如何解决VOIP通知丢失或延迟
我怎么知道我的设备无法接收VoIP通知?
应用程序接收3-4次后将停止接收VoIP通知。我了解从iOS 13开始,VoIP通知应报告给CallKit。即使在向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 +
自最近两个月以来,我一直在努力解决此问题,但无法解决。请帮助我
谢谢。
解决方法
实际上,您似乎并没有为每个VoIP推送通知报告一个新的来电。的确,当有一个活动的CallKit呼叫时,您可以在不报告新呼入呼叫的情况下接收VoIP推送,但这并不像看起来那样简单。由于CallKit和PushKit是异步的,因此不能保证在收到K.KEY.PUSHTOTALK
或K.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,completion: completion)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。