我在VoIP应用程序中实现了CallKit支持。
我可以通过在supportsVideo
中将false
设置为CXProviderConfiguration
来停用视频按钮。现在出现了FaceTime按钮。
我想知道是否有办法在默认用户界面中禁用FaceTime按钮,因为该应用正在处理与FaceTime无关的内部企业号码。
更新:
如下面的答案中所述,可以禁用按钮,但来电号码丢失(显示为Unknown
)。我想保留数字并禁用FaceTime按钮。
更新: 在iPhone设置中禁用FaceTime会禁用FaceTime按钮。但是,它不是解决问题的有效方法。
更新:
对CXHandle
类型的任何更改(包括插入对电话号码无效的字符)都不会影响问题 - 仍会显示FaceTime按钮。
答案 0 :(得分:3)
在好消息/坏消息中,我可以通过清除remoteHandle
(未删除或隐藏,仅显示为灰色)来禁用FaceTime按钮。
但是,作为副作用,如果您未设置localizedCallerName
的{{1}}属性,则来电者会显示为“未知”。
没有手柄的呼叫将产生不能在最近按下的可按压的副作用。
CXCallUpdate
答案 1 :(得分:1)
我把头发拉出来解决这个问题,取消remoteHandle会禁用按钮,但你不能再从系统调用历史记录中调用了。
最后想出了一个完美的解决方案,我想分享。
假设我们同时支持音频/视频。
初始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)
委托中结束通话时更新remoteHandle。
当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()
}
答案 2 :(得分:0)
通过清除remoteHandle可以真正禁用FaceTime按钮,因为@Eli Burke说,但副作用是禁用来自最近的调用。我不知道为什么。
答案 3 :(得分:0)
我通过遵循与disabling the "Add Call" button相同的方法禁用了FaceTime按钮,这不会破坏来电者姓名功能,但奇怪的是,如果用户触摸扬声器按钮,FaceTime按钮会再次激活。我不明白为什么这种行为不是Apple的错误,所以我只是放弃了正确的修复。
编辑:原因如下:只有在建立了通话后,我才将CXHandle
归因于CXCallUpdate
,因此首先禁用FaceTime按钮,因为没有CXHandle
。激活扬声器按钮以某种方式强制CallKit UI中的更新 - 此时,已经存在CXHandle
,因此FaceTime按钮将被启用。