在CallKit UI中隐藏FaceTime按钮

我正在VoIP应用程序中实现CallKit支持。

我可以通过在CXProviderConfiguration设置为false来禁用video按钮。 现在出现了FaceTime按钮。

我想知道是否有一种方法可以在默认UI中禁用FaceTime按钮,因为该应用程序正在处理与FaceTime无关的内部企业编号。


更新 :如下面的答案中所述,可以禁用该按钮,但呼叫者号码丢失(显示为“ Unknown )。 我想保留数字并禁用FaceTime按钮。


更新 :在iPhone设置中禁用FaceTime会禁用FaceTime按钮。 但是,这不是解决问题的有效方法。


更新 :对CXHandle类型的任何更改,包括插入对电话号码无效的字符,都不会影响问题 – 仍会显示FaceTime按钮。

在好消息/坏消息中,我可以通过清除remoteHandle来禁用FaceTime按钮(不删除或隐藏,只是变灰)。

但是,作为副作用,如果未设置CXCallUpdatelocalizedCallerName属性,则调用者将显示为“未知”。
没有手柄的呼叫会产生无法在最近处按下的副作用。

 CXCallUpdate *callUpdate = [[CXCallUpdate alloc] init]; //callUpdate.remoteHandle = [[CXHandle alloc] initWithType:CXHandleTypeGeneric value:handle]; [self.provider reportNewIncomingCallWithUUID:uuid update:callUpdate completion:^(NSError* error) {}]; 

通过清除remoteHandle可以真正禁用FaceTime按钮,因为@Eli Burke说,但副作用是禁用来自最近的调用。 我不知道为什么。

我已经按照与禁用“添加呼叫”按钮相同的方法禁用了FaceTime按钮,该按钮不会破坏呼叫者姓名function,但奇怪的是,如果用户触摸扬声器按钮,FaceTime按钮将再次激活。 我不明白为什么这种行为不是Apple的bug,所以我放弃了正确的修复。

编辑:这就是原因:只有在建立调用后我才将CXHandleCXCallUpdate ,所以首先,FaceTime按钮被禁用,因为没有CXHandle 。 激活扬声器按钮以某种方式强制在CallKit UI中进行更新 – 此时,已经存在CXHandle ,因此FaceTime按钮将被启用。

我把头发拉出来解决这个问题,删除remoteHandle确实禁用了按钮,但你不能再从系统调用历史记录中调用了。

终于想出了一个完美的解决方案,我想分享一下。

假设我们同时支持音频/video。

  1. Init CXProviderConfiguration

     let providerConfiguration = CXProviderConfiguration(localizedName: "yourConfigName") providerConfiguration.supportsVideo = supportsVideo providerConfiguration.supportedHandleTypes = [.generic, .phoneNumber, .emailAddress] // Pick your own supportedHandleTypes. 
  2. 报告来电时排除remoteHandle

     let update = CXCallUpdate() // Set hasVideo so it shows correct type on incomingCall screen. update.hasVideo = supportsVideo // Exclude remoteHandle so that the FaceTime button is disabled // update.remoteHandle = CXHandle(type: .generic, value: yourHandle) 
  3. 重要! 在结束调用时,在func provider(_ provider: CXProvider, perform action: CXEndCallAction)委托中func provider(_ provider: CXProvider, perform action: CXEndCallAction)

当reportIncomingCall失去从系统调用历史记录调用的能力时,排除remoteHandle。 但您可以在结束通话之前更新通话并进行设置。

  func provider(_ provider: CXProvider, perform action: CXEndCallAction) { let update = CXCallUpdate() // Set the remoteHandle, so you can call from System Call History update.remoteHandle = CXHandle(type: .generic, value: yourHandle) provider.reportCall(with: uuid, updated: update) action.fulfill() }