我正在实现对讲功能,根据规格,该功能应仅报告并允许一个呼叫,如果已报告或已应答(正在进行),则忽略任何呼叫请求。
最简单的方法是忽略后续呼叫的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
的规则。
答案 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已更改其工作方式。>