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

问题描述 投票:0回答:1

我正在实现一个对讲功能,按照规范应该只报告和允许一个呼叫,如果已经有一个呼叫请求被报告或应答(进行中),则忽略任何呼叫请求。

最简单的做法是忽略后续呼叫的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().

ios swift callkit pushkit
1个回答
1
投票

我知道文档中说,每个VoIP推送通知必须报告一个新的来电。但是,据我所知,只要你已经有一个活动的电话,你就可以自由地接收任何VoIP推送,而不必报告另一个新的来电。

我不知道这是否只是文档的不精确,或者如果苹果公司计划在未来也删除这种可能性,但事实是,它是工作。我有一个应用程序发布在App Store,工作没有任何问题,我只是做你想做的:忽略任何额外的VoIP推送,如果一个电话已经在进行中。

问题是:很清楚苹果为什么在收到VoIP推送时强制我们报告一个新的来电的原因,不是吗?但是,只要通话正在进行中,你的应用就是活跃的、运行的,对吗?为什么他们要在这种情况下也限制使用VoIP推送呢?任何你能用VoIP推送做的事情,只要应用程序在运行,你也可以不用VoIP推送来做。


0
投票

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

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

这让苹果公司很高兴:-).而且没有任何关于取消呼叫的UI显示给用户.

也请务必阅读@Marco的回答。这绝对是一个拒绝呼叫的好方法(通过忽略通知),但由于文档中没有明确提到,我不想将来发现苹果改变了工作方式。

© www.soinside.com 2019 - 2024. All rights reserved.