我正在实现一个对讲功能,按照规范应该只报告和允许一个呼叫,如果已经有一个呼叫请求被报告或应答(进行中),则忽略任何呼叫请求。
最简单的做法是忽略后续呼叫的VoIP推送通知信息,但这是苹果不允许的,因为如果通知之后没有呼叫到 CXProvider
's 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
是一个实例 CXCallController
. 我也尝试了两者的组合,但第二个电话仍然被报告,我不得不手动结束它。
有没有一种 "合法 "的方式来丢弃VoIP呼叫请求?我没有在文档中找到任何东西,只是发现每个VoIP推送通知后必须有一个呼叫的规则。reportIncomingCall()
.
我知道文档中说,每个VoIP推送通知必须报告一个新的来电。但是,据我所知,只要你已经有一个活动的电话,你就可以自由地接收任何VoIP推送,而不必报告另一个新的来电。
我不知道这是否只是文档的不精确,或者如果苹果公司计划在未来也删除这种可能性,但事实是,它是工作。我有一个应用程序发布在App Store,工作没有任何问题,我只是做你想做的:忽略任何额外的VoIP推送,如果一个电话已经在进行中。
问题是:很清楚苹果为什么在收到VoIP推送时强制我们报告一个新的来电的原因,不是吗?但是,只要通话正在进行中,你的应用就是活跃的、运行的,对吗?为什么他们要在这种情况下也限制使用VoIP推送呢?任何你能用VoIP推送做的事情,只要应用程序在运行,你也可以不用VoIP推送来做。
事实证明我在代码中犯了一个错误--我把错误的标识符传给了 reportCall(with:endedAt:reason:)
,所以并没有结束刚才报告的呼叫。所以这段代码可以正常工作。
self.provider.reportNewIncomingCall(with: uuid, update: update) { error in
self.provider.reportCall(with: uuid, endedAt: Date(), reason: .answeredElsewhere)
}
这让苹果公司很高兴:-).而且没有任何关于取消呼叫的UI显示给用户.
也请务必阅读@Marco的回答。这绝对是一个拒绝呼叫的好方法(通过忽略通知),但由于文档中没有明确提到,我不想将来发现苹果改变了工作方式。