拒绝来电推送后无法处理取消VOIP推送

Posted

技术标签:

【中文标题】拒绝来电推送后无法处理取消VOIP推送【英文标题】:Unable to handle the cancel VOIP push comes after rejecting the incoming call push 【发布时间】:2020-12-17 14:56:24 【问题描述】:

我已经开发了一个 VOIP 呼叫应用程序,它使用 pushkit 进行 VOIP 推送通知。我们的通知服务器旨在通过 VOIP 推送发送所有取消通知以及新的来电通知(此行为目前无法更改)。因为在 ios 13 发布后,必须向 callkit 报告所有传入的推送通知。在某些情况下,我无法向 callkit 报告取消推送通知,最终导致应用崩溃

场景:

如果用户拒绝来电 PUSH 通知(即基本上拒绝来电),通知服务器会在此之后发送取消 PUSH 通知。但是由于新来电已经被拒绝,并且没有主动callId上报,所以没有办法上报cancel PUSH通知给callkit。因此,未能报告取消推送会导致应用内崩溃。这确实发生在所有没有活动/待定呼叫并且客户端推送取消通知的情况。

请帮助我了解如何处理这种情况。

【问题讨论】:

显而易见的答案是发送普通通知而不是 VoIP 通知。但是既然你写了这不能做,也许在那个特定的场景下你可以暂时取消注册 VoIP 推送设备令牌,这样就不会收到取消通知 @ArikSegal 感谢您的回复!但不确定在这里取消注册 VOIP 推送是否有意义,因为接收传入取消推送以拒绝呼叫和取消注册 VOIP 呼叫的事件都是相互独立的并且也是异步的。此外,如果没有活动/待处理的调用,应用程序会在每次取消注册时取消注册,然后重新注册。 【参考方案1】:

正如您所说:从 iOS 13 开始,必须为收到的每个 VoIP 推送报告新的来电。

没有办法解决这个问题。如果您无法更改服务器的行为,那么避免崩溃(以及阻止后续 VoIP 推送传递)的唯一方法是报告虚假呼叫以使 PushKit 满意并立即终止它。

let callId = UUID()
cxProvider.reportNewIncomingCall(
    with: callId,
    update: callUpdate,
    completion:  [weak self] error in
        completion()
        self?.cxProvider.reportCall(with: callId, endedAt: nil, reason: .failed)
)

【讨论】:

感谢@Marco 的回复!我们目前正在这样做,但这确实会导致每次取消通知到达时都会出现来电 UI。有没有办法避免来电 UI 出现? 不幸的是没有。完美解决问题的唯一方法是首先避免发送取消通知,但是您说您无法更改服务器行为。所以,这是你能得到的最好的,对不起。 显示假电话大约需要 1 秒钟,然后在您报告结束时自动结束,这不是一个非常好的用户体验。有没有其他方法可以处理@Marco? @jacob 当然这不是一个好的用户体验,我知道这真的很烦人。但是,正如我已经说过的:当且仅当您无法避免在没有活动呼叫的情况下发送未发出新来电信号的 VoIP 推送时,这是一种让 iOS 满意的解决方法。如果您的服务器只为新来电发送 VoIP 推送(Apple 希望您这样做),则不需要此解决方法。 @Marco 听起来无声推送呼叫取消是最佳选择。还有一个问题,正如我所见,这个问题似乎发生在非活动状态,对吗? (因为我检查了 crashlytics 日志并且所有内容都在后台)

以上是关于拒绝来电推送后无法处理取消VOIP推送的主要内容,如果未能解决你的问题,请参考以下文章

关于来电 iOS 的 VOIP

直接在推送 iOS 上启动 App

关于安卓未接来电通知

延迟网络中的 iOS 推送通知

callkit来电语音问题

从iOS的电话记录中拨打voip电话