在CallKit UI中隐藏FaceTime按钮
我正在VoIP应用程序中实现CallKit支持。
我可以通过在CXProviderConfiguration
设置为false
来禁用video按钮。 现在出现了FaceTime按钮。
我想知道是否有一种方法可以在默认UI中禁用FaceTime按钮,因为该应用程序正在处理与FaceTime无关的内部企业编号。
更新 :如下面的答案中所述,可以禁用该按钮,但呼叫者号码丢失(显示为“ Unknown
)。 我想保留数字并禁用FaceTime按钮。
更新 :在iPhone设置中禁用FaceTime会禁用FaceTime按钮。 但是,这不是解决问题的有效方法。
更新 :对CXHandle
类型的任何更改,包括插入对电话号码无效的字符,都不会影响问题 – 仍会显示FaceTime按钮。
在好消息/坏消息中,我可以通过清除remoteHandle
来禁用FaceTime按钮(不删除或隐藏,只是变灰)。
但是,作为副作用,如果未设置CXCallUpdate
的localizedCallerName
属性,则调用者将显示为“未知”。
没有手柄的呼叫会产生无法在最近处按下的副作用。
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,所以我放弃了正确的修复。
编辑:这就是原因:只有在建立调用后我才将CXHandle
于CXCallUpdate
,所以首先,FaceTime按钮被禁用,因为没有CXHandle
。 激活扬声器按钮以某种方式强制在CallKit UI中进行更新 – 此时,已经存在CXHandle
,因此FaceTime按钮将被启用。
我把头发拉出来解决这个问题,删除remoteHandle确实禁用了按钮,但你不能再从系统调用历史记录中调用了。
终于想出了一个完美的解决方案,我想分享一下。
假设我们同时支持音频/video。
-
Init
CXProviderConfiguration
。let providerConfiguration = CXProviderConfiguration(localizedName: "yourConfigName") providerConfiguration.supportsVideo = supportsVideo providerConfiguration.supportedHandleTypes = [.generic, .phoneNumber, .emailAddress] // Pick your own supportedHandleTypes.
-
报告来电时排除
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)
-
重要! 在结束调用时,在
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() }