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

Ios 有没有办法放弃VoIP推送通知呼叫请求?,ios,swift,callkit,pushkit,Ios,Swift,Callkit,Pushkit,我正在实现一个对讲功能,根据规范,该功能应该只报告和允许一个呼叫,如果有一个呼叫请求已经报告或正在应答,则忽略任何呼叫请求 最简单的做法是忽略后续呼叫的VoIP推送通知消息,但苹果不允许这样做,因为如果通知之后没有呼叫CXProvider的reportIncomingCallwith:update:completion,应用程序将被终止,我想这是为了防止将这些通知用于其他目的,值得怀疑的选择 因此,即使必须放弃调用,推送通知处理程序也必须调用该方法。 我尝试调用reportIncomingCal

我正在实现一个对讲功能,根据规范,该功能应该只报告和允许一个呼叫,如果有一个呼叫请求已经报告或正在应答,则忽略任何呼叫请求

最简单的做法是忽略后续呼叫的VoIP推送通知消息,但苹果不允许这样做,因为如果通知之后没有呼叫CXProvider的reportIncomingCallwith:update:completion,应用程序将被终止,我想这是为了防止将这些通知用于其他目的,值得怀疑的选择

因此,即使必须放弃调用,推送通知处理程序也必须调用该方法。 我尝试调用reportIncomingCall,然后使用以下任一方法发出通话结束请求:

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

请注意,这不是我正在使用的实际代码,因为在项目中,体系结构更加详细

其中controller是CXCallController的实例。我也尝试了两者的结合,但第二次呼叫仍然报告,我必须手动结束它


是否有合法的方式放弃VoIP呼叫请求?我在文档中没有找到任何内容,只是每个VoIP推送通知后面必须有一个到reportIncomingCall的呼叫的规则。

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

我不知道是否只是文档不准确,或者苹果是否计划在将来消除这种可能性,但事实是它正在发挥作用。我在app Store中发布了一个应用程序,它可以毫无问题地工作,我只做你想做的事情:如果呼叫已经在进行中,则忽略任何额外的VoIP推送


问题是:苹果公司强迫我们在接到VoIP推送后报告新来电的原因很清楚,不是吗?但是,只要有呼叫在进行,你的应用程序就处于活动状态并正在运行,对吗?在这种情况下,他们为什么还要限制VoIP推送的使用?使用VoIP推送可以做的任何事情,只要应用程序正在运行,也可以不使用VoIP推送来完成。

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

我不知道是否只是文档不准确,或者苹果是否计划在将来消除这种可能性,但事实是它正在发挥作用。我在app Store中发布了一个应用程序,它可以毫无问题地工作,我只做你想做的事情:如果呼叫已经在进行中,则忽略任何额外的VoIP推送


问题是:苹果公司强迫我们在接到VoIP推送后报告新来电的原因很清楚,不是吗?但是,只要有呼叫在进行,你的应用程序就处于活动状态并正在运行,对吗?在这种情况下,他们为什么还要限制VoIP推送的使用?使用VoIP推送可以完成的任何操作,只要应用程序正在运行,也可以不使用VoIP推送来完成。

结果证明我的代码中犯了一个错误-我将错误的标识符传递给了reportCallwith:endedAt:reason:,因此它没有结束刚刚报告的呼叫。因此,这段代码可以很好地工作:

self.provider.reportNewIncomingCall(with: uuid, update: update) { error in
  self.provider.reportCall(with: uuid, endedAt: Date(), reason: .answeredElsewhere)
}
这让苹果很高兴:-,而且没有向用户显示关于取消呼叫的用户界面


请务必阅读@Marco的答案。这无疑是一种通过忽略通知来拒绝呼叫的好方法,但由于文档中没有明确提及,我不想在将来发现苹果已经改变了它的工作方式。

事实证明我在代码中犯了一个错误-我将错误的标识符传递给reportCallwith:endedAt:reason:,所以它并没有结束刚刚报道的通话。因此,这段代码可以很好地工作:

self.provider.reportNewIncomingCall(with: uuid, update: update) { error in
  self.provider.reportCall(with: uuid, endedAt: Date(), reason: .answeredElsewhere)
}
这让苹果很高兴:-,而且没有向用户显示关于取消呼叫的用户界面


请务必阅读@Marco的答案。这无疑是一种通过忽略通知来拒绝来电的好方法,但由于文档中没有明确提及,我不想在将来发现苹果已经改变了它的工作方式。

我真的怀疑是否有解决方法。苹果不想让你决定哪些电话应该向用户显示/隐藏。你提出的任何解决方案都很可能被拒绝,如果它通过并在以后被拒绝,你的应用程序就有被删除的风险。我真的怀疑是否有解决方案。苹果不想让你决定哪些电话应该向用户显示/隐藏。您提出的任何解决方案都很可能会被拒绝,如果它通过并在以后被拒绝,您的应用程序将面临被删除的风险。感谢分享您的解决方案。那将是最好的

确实是解决方案,但由于没有明确的文档记录,我担心苹果将来可能会悄悄地改变这一点,并将终止协议扩展到该情况。苹果开发者论坛接受的答案与您所说的一致:每次接到VOIP呼叫时,您都需要报告呼叫,否则系统会杀死你的VOIPregister@famfamfam一位苹果工程师证实了我的回答在技术上是正确的。尽管有一些警告。请看下面的答案,了解我在说什么:谢谢,很抱歉错误地了解了你的答案,我正在试图找到一种方法,在用户处于睡眠状态或忙碌状态时,在约30秒钟内关闭来电,但似乎唯一的方法是放弃服务器推送,谢谢分享你的解决方案。这确实是最好的解决方案,但由于没有明确的文档记录,我担心苹果将来可能会悄悄地改变这一点,将终止协议的范围扩大到这种情况。苹果开发者论坛接受的答案与您所说的一致:您需要在每次接到VOIP呼叫时报告呼叫,否则系统会杀死你的VOIPregister@famfamfam一位苹果工程师证实了我的回答在技术上是正确的。尽管有一些警告。请看下面的答案,了解我在说什么:谢谢,很抱歉对您的答案有错误的了解,我试图找到一种方法,在用户处于睡眠状态或忙碌状态时,在约30秒的时间内关闭来电,但似乎唯一的方法是放弃服务器的推送,如果来电不是针对我们的手机,该怎么办?我们的服务器向所有人广播,我们需要在客户端处理该呼叫是否为我们。@Jaswansingh VoIP通知不会广播,除非是手动完成的。如果这种情况发生在您的服务器上,我认为这是一个开发错误。我确实立即报告了呼叫结束,但呼叫屏幕在1秒后仍然显示?任何解决方案都要感谢我找到的唯一解决方案是显示取消的呼叫,而不是实际的呼叫方ID。我没有找到任何解决方法来防止UI出现。如果用户不接受,我会在30秒后使用计时器发布此报告呼叫,但在应用程序未运行+屏幕锁定时不工作,你遇到这个问题了吗?如果这个电话不是为我们的手机打的,怎么办?我们的服务器向所有人广播,我们需要在客户端处理该呼叫是否为我们。@Jaswansingh VoIP通知不会广播,除非是手动完成的。如果这种情况发生在您的服务器上,我认为这是一个开发错误。我确实立即报告了呼叫结束,但呼叫屏幕在1秒后仍然显示?任何解决方案都要感谢我找到的唯一解决方案是显示取消的呼叫,而不是实际的来电显示。我还没有找到任何解决方法来防止UI出现。如果用户不接受,我会在30秒后使用计时器发布此报告呼叫,但在应用程序未运行+屏幕锁定时不工作,你遇到此问题了吗?