Ios 呼叫结束后到达的PushKit通知

Ios 呼叫结束后到达的PushKit通知,ios,swift,callkit,pushkit,Ios,Swift,Callkit,Pushkit,我有一个实现PushKit和CallKit的应用程序。出现问题的场景如下所示: 设备A发起呼叫,向设备B发送PushKit通知。 设备B没有互联网连接,因此不接收呼叫。 设备A结束通话。 设备B在一段时间后连接到internet。 设备B接收设备A先前发送的PushKit通知,并显示CallKit传入呼叫UI 如您所见,即使在设备A结束呼叫后,设备B也会显示CallKit来电界面 如何防止设备B接收来电 谢谢,您应该通过PushKit通知发送结束呼叫信号,这样,一旦设备B重新连接,它将同时接收开

我有一个实现PushKit和CallKit的应用程序。出现问题的场景如下所示:

设备A发起呼叫,向设备B发送PushKit通知。 设备B没有互联网连接,因此不接收呼叫。 设备A结束通话。 设备B在一段时间后连接到internet。 设备B接收设备A先前发送的PushKit通知,并显示CallKit传入呼叫UI

如您所见,即使在设备A结束呼叫后,设备B也会显示CallKit来电界面

如何防止设备B接收来电


谢谢,您应该通过PushKit通知发送结束呼叫信号,这样,一旦设备B重新连接,它将同时接收开始呼叫和结束呼叫通知。

在iOS 13中,您必须在离开PushKit完成处理程序之前报告传入呼叫,否则,您的应用程序将被阻止接收进一步的PushKit推送。显然,当您遇到如您所描述的呼叫不再存在的情况时,这是一个小问题

这一场景和其他场景在一次研讨会上进行了讨论

对于您的案例,具体建议如下:

  • 虽然您必须立即报告传入呼叫,但您仍然可以确定呼叫失败,并在稍后异步通知系统。为此,请调用reportCallWithUUID:EndedataDate:reason:。即使用户没有接听来电,这也会破坏来电界面
  • 如果用户在点击accept call(接受呼叫)按钮时特别快,或者如果网络状况不佳或存在大量延迟,则您只需等待必要的握手完成,然后再调用CXAnswerCallAction上的fulfill。对用户而言,通话似乎需要一些时间才能连接,这是一种常见的体验,即使是标准电话

  • 请注意,系统需要几秒钟的时间来设置来电用户界面的动画,在此期间,应用程序有机会完成此握手,因此,如果握手需要很长时间才能完成,则这只会对用户产生可见的影响


因此,您需要做的是报告呼叫,然后当您确定呼叫不再有效(这不会花费很长时间)时,立即结束呼叫。

这将导致在设备B重新连接时调用didReceivePush两次。这不会造成竞争条件吗?这也不起作用,因为您必须为每个PushKit通知报告一个呼叫,否则您的应用程序将被阻止接收它们。是的,这将导致调用didReceivePush两次,但第一次您报告呼叫,第二次您仅结束呼叫。你必须发送两个内容不同的推送来区分它们@Paulw11据我所能测试,当有一个活动呼叫(即,您已经报告了一个呼叫)时,您不必在收到PushKit通知时报告新呼叫。感谢您的回复。我遇到了在推送通知负载中指定的apns过期参数。设置为0时,推送通知在未立即传递时将被丢弃。这能帮我解决问题吗?肯定会有帮助,但这不是100%的解决方案。你仍然需要处理这样的情况:呼叫者开始呼叫,然后立即结束呼叫,导致竞争条件,应用程序接收到一个不再有效的呼叫推送。感谢你的详细回复,expiration参数必须为0,但我发现它实际上不是0。我认为它至少相当于10秒。你可以很容易地测试它:在设备B上激活飞机模式,用设备a打电话,然后很快挂断,等待10秒,然后停用飞机模式;您将在设备B上接收呼叫。重复此测试,增加几秒钟的等待时间,直到您无法接收呼叫。