有没有办法丢弃VoIP推送通知呼叫请求?

时间:2020-06-10 08:30:35

标签: ios swift callkit pushkit

我正在实现对讲功能,根据规格,该功能应仅报告并允许一个呼叫,如果已报告或已应答(正在进行),则忽略任何呼叫请求。

最简单的方法是忽略后续呼叫的VoIP推送通知消息,但这是Apple所不允许的,因为如果在通知之后没有呼叫CXProvider的{​​{1}} ,则该应用程序终止了(我想这是为了防止将这些通知用于其他目的,可疑的选择...)。

因此,即使必须放弃调用,推送通知处理程序也仍必须调用该方法。 我尝试使用以下任一方法呼叫reportIncomingCall(with:update:completion),然后结束通话请求:

reportIncomingCall()

self.provider.reportNewIncomingCall(with: uuid, update: update) { error in
  self.provider.reportCall(with: uuid, endedAt: Date(), reason: .answeredElsewhere)
}

(请注意,这不是我正在使用的实际代码,因为该项目对体系结构进行了详细说明)

其中self.provider.reportNewIncomingCall(with: uuid, update: update) { error in let endCallAction = CXEndCallAction(call: uuid) let transaction = CXTransaction(action: endCallAction) self.controller.request(transaction) { error in } } controller的实例。我也尝试将两者结合使用,但是仍然报告了第二次通话,我必须手动结束它。

是否有丢弃VoIP呼叫请求的“合法”方法?我没有在文档中找到任何内容,只是在每个VoIP推送通知之后都必须有一个呼叫CXCallController的规则。

2 个答案:

答案 0 :(得分:1)

我知道文档说明每个VoIP推送通知必须报告一个新的来话呼叫。但是,据我所知,只要您已经有一个通话,就可以免费接收任何VoIP推送,而不必报告另一个新的来电。

我不知道是不是精确的文档,还是苹果计划在将来删除这种可能性,但事实是它正在起作用。我有一个在App Store中发布的应用程序,该应用程序可以正常运行,而我只是做您想做的事情:如果正在进行通话,请忽略任何其他VoIP推送。

问题是:很明显,Apple强迫我们在收到VoIP推送后报告新的来话,不是吗?但是,只要正在进行通话,您的应用程序就会处于活动状态并正在运行,对吗?在这种情况下,为什么还要限制VoIP推送的使用?只要应用程序正在运行,您就可以使用VoIP推送进行任何操作,也可以在没有VoIP推送的情况下进行此操作。

答案 1 :(得分:1)

事实证明我在代码中犯了一个错误-我将错误的标识符传递给reportCall(with:endedAt:reason:),因此它并未结束刚刚报告的呼叫。所以这段代码可以正常工作:

self.provider.reportNewIncomingCall(with: uuid, update: update) { error in
  self.provider.reportCall(with: uuid, endedAt: Date(), reason: .answeredElsewhere)
}

这使Apple感到高兴:-)。,并且没有向用户显示有关该已取消呼叫的UI。

确保还阅读@Marco的答案。肯定是拒绝呼叫的好方法(只需忽略通知即可),但是由于文档中未明确提及,因此我不想在将来发现Apple已更改其工作方式。