有没有办法放弃 VoIP 推送通知呼叫请求?
Is there a way to discard a VoIP push notification call request?
我正在实施一项内部通信功能,根据规范,该功能应该只报告并允许一个呼叫,如果已经报告或回答(正在进行)则忽略任何呼叫请求。
最简单的做法是忽略后续呼叫的 VoIP 推送通知消息,但 Apple 不允许这样做,因为如果通知后没有调用 CXProvider
的 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
的实例。我也尝试了两者的组合,但是第二次调用仍然被报告,我必须手动结束它。
是否有 "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 的回答。这绝对是拒绝来电的好方法(通过忽略通知),但由于它没有在文档中明确提及,我不想在未来发现苹果改变了它的工作方式。
我正在实施一项内部通信功能,根据规范,该功能应该只报告并允许一个呼叫,如果已经报告或回答(正在进行)则忽略任何呼叫请求。
最简单的做法是忽略后续呼叫的 VoIP 推送通知消息,但 Apple 不允许这样做,因为如果通知后没有调用 CXProvider
的 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
的实例。我也尝试了两者的组合,但是第二次调用仍然被报告,我必须手动结束它。
是否有 "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 的回答。这绝对是拒绝来电的好方法(通过忽略通知),但由于它没有在文档中明确提及,我不想在未来发现苹果改变了它的工作方式。