我有一个实现PushKit和CallKit的应用程序。问题发生的场景如下:
设备A发起呼叫,向设备B发送PushKit通知。设备B没有互联网连接,因此没有接收到该呼叫。设备A结束呼叫。设备B在一段时间后连接到互联网。设备B接收设备A先前发送的PushKit通知,并显示CallKit Incoming Call UI。
如您所见,即使在设备A结束呼叫后,设备B也会显示CallKit Incoming Call UI。
如何防止设备B接收来电?
感谢
您应该通过PushKit通知发送结束呼叫信号,这样,一旦设备B重新连接,它就会同时收到开始呼叫和结束呼叫通知。
在iOS 13中,您必须在离开PushKit完成处理程序之前报告来电,否则您的应用程序将被阻止接收进一步的PushKit推送。显然,当您遇到如您所描述的呼叫不再存在的情况时,这是一个小问题。
这个场景和其他场景在苹果开发者论坛的线程中进行了讨论
您的具体建议是:
- 虽然您必须立即报告传入呼叫,但您仍然可以决定呼叫失败,并在稍后异步通知系统。要执行此操作,请调用reportCallWithUUID:endedAtDate:reason:。即使用户没有接听电话,这也会破坏来电UI
如果用户点击接受呼叫按钮的速度特别快,或者网络条件很差,或者有很多延迟,那么您应该简单地等到必要的握手完成后,再在CXAnswerCallAction上呼叫履行。对用户来说,通话似乎需要一些时间才能连接,即使是标准电话,这也是一种常见的体验。
请注意,系统需要几秒钟的时间来激活传入呼叫UI,在此期间,应用程序有机会完成此握手,因此只有在握手需要很长时间才能完成的情况下,这才会对用户产生可见的影响。
因此,您需要做的是报告呼叫,然后当您确定呼叫不再有效时(这应该不会花很长时间(,立即结束呼叫。