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.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, update: update, completion: completion)
我怎么知道我的设备被阻止接收 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.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, update: update, completion: completion)