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

Is there a way to discard a VoIP push notification call request?

我正在实施一项内部通信功能,根据规范,该功能应该只报告并允许一个呼叫,如果已经报告或回答(正在进行)则忽略任何呼叫请求。

最简单的做法是忽略后续呼叫的 VoIP 推送通知消息,但 Apple 不允许这样做,因为如果通知后没有调用 CXProviderreportIncomingCall(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
  }  
}

(请注意,这不是我使用的实际代码,因为项目中的架构更加详细)

其中 controllerCXCallController 的实例。我也尝试了两者的组合,但是第二次调用仍然被报告,我必须手动结束它。

是否有 "legal" 方法来丢弃 VoIP 呼叫请求?我没有在文档中找到任何内容,只是每个 VoIP 推送通知之后必须调用 reportIncomingCall().

的规则

我知道文档说每个 VoIP 推送通知都必须报告一个新来电。但是,据我所知,只要您已经有一个活动呼叫,您就可以自由接收任何 VoIP 推送,而无需报告另一个新来电。

我不知道这是否只是文档不准确,或者 Apple 是否计划在未来也消除这种可能性,但事实是它正在发挥作用。我在 App Store 中发布了一个可以正常运行的应用程序,我只是按照您的意愿执行操作:如果通话正在进行中,请忽略任何额外的 VoIP 推送。

问题是:Apple 强制我们在收到 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)
}

这让 Apple 很高兴 :-)., 并且 UI 没有向用户显示关于那个取消的电话。

一定要阅读@Marco 的回答。这绝对是拒绝来电的好方法(通过忽略通知),但由于它没有在文档中明确提及,我不想在未来发现苹果改变了它的工作方式。