在 CallKit 中隐藏 FaceTime 按钮 UI
Hide FaceTime button in CallKit UI
我正在 VoIP 应用程序中实现 CallKit 支持。
我可以通过在 CXProviderConfiguration
中将 supportsVideo
设置为 false
来禁用视频按钮。现在 FaceTime 按钮出现了。
我想知道是否有办法禁用默认的 FaceTime 按钮 UI,因为该应用正在处理与 FaceTime 无关的内部企业号码。
更新:
如以下答案所述,可以禁用该按钮,但来电号码会丢失(显示为 Unknown
)。我想保留号码并禁用 FaceTime 按钮。
更新:
在 iPhone 设置中禁用 FaceTime 会禁用 FaceTime 按钮。然而,这不是解决问题的有效方法。
更新:
对 CXHandle
类型的任何更改,包括向其中插入对 phone 号码无效的字符,都不会影响问题 - FaceTime 按钮仍然显示。
好消息是 news/bad,我可以通过清除 remoteHandle
来禁用 FaceTime 按钮(不是删除或隐藏,只是变灰)。
但是,作为副作用,如果您不设置 CXCallUpdate
的 localizedCallerName
属性,调用者将显示为 "Unknown"。
没有句柄的呼叫会产生在最近通话中不可按下的副作用。
CXCallUpdate *callUpdate = [[CXCallUpdate alloc] init];
//callUpdate.remoteHandle = [[CXHandle alloc] initWithType:CXHandleTypeGeneric value:handle];
[self.provider reportNewIncomingCallWithUUID:uuid update:callUpdate completion:^(NSError* error) {}];
正如@Eli Burke 所说,确实可以通过清除 remoteHandle 来禁用 FaceTime 按钮,但副作用是禁用来自最近通话的呼叫。不知道为什么。
我按照与 相同的方法禁用了 FaceTime 按钮,这不会破坏来电者姓名功能,但奇怪的是,如果用户触摸扬声器,FaceTime 按钮会再次激活按钮。我不明白为什么这种行为不是 Apple 错误,所以我放弃了适当的修复。
编辑:原因如下:只有在通话建立后,我才将 CXHandle
归因于 CXCallUpdate
,因此起初 FaceTime 按钮被禁用,因为没有 CXHandle
.激活扬声器按钮以某种方式强制更新 CallKit UI - 此时,已经存在 CXHandle
,因此 FaceTime 按钮将被启用。
这个问题我急了,删除 remoteHandle 确实禁用了按钮,但是你不能再从系统调用历史中调用了。
终于想出了一个完美的解决方案,分享一下。
假设我们同时支持 Audio/Video。
初始化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()
}
我正在 VoIP 应用程序中实现 CallKit 支持。
我可以通过在 CXProviderConfiguration
中将 supportsVideo
设置为 false
来禁用视频按钮。现在 FaceTime 按钮出现了。
我想知道是否有办法禁用默认的 FaceTime 按钮 UI,因为该应用正在处理与 FaceTime 无关的内部企业号码。
更新:
如以下答案所述,可以禁用该按钮,但来电号码会丢失(显示为 Unknown
)。我想保留号码并禁用 FaceTime 按钮。
更新: 在 iPhone 设置中禁用 FaceTime 会禁用 FaceTime 按钮。然而,这不是解决问题的有效方法。
更新:
对 CXHandle
类型的任何更改,包括向其中插入对 phone 号码无效的字符,都不会影响问题 - FaceTime 按钮仍然显示。
好消息是 news/bad,我可以通过清除 remoteHandle
来禁用 FaceTime 按钮(不是删除或隐藏,只是变灰)。
但是,作为副作用,如果您不设置 CXCallUpdate
的 localizedCallerName
属性,调用者将显示为 "Unknown"。
没有句柄的呼叫会产生在最近通话中不可按下的副作用。
CXCallUpdate *callUpdate = [[CXCallUpdate alloc] init];
//callUpdate.remoteHandle = [[CXHandle alloc] initWithType:CXHandleTypeGeneric value:handle];
[self.provider reportNewIncomingCallWithUUID:uuid update:callUpdate completion:^(NSError* error) {}];
正如@Eli Burke 所说,确实可以通过清除 remoteHandle 来禁用 FaceTime 按钮,但副作用是禁用来自最近通话的呼叫。不知道为什么。
我按照与
编辑:原因如下:只有在通话建立后,我才将 CXHandle
归因于 CXCallUpdate
,因此起初 FaceTime 按钮被禁用,因为没有 CXHandle
.激活扬声器按钮以某种方式强制更新 CallKit UI - 此时,已经存在 CXHandle
,因此 FaceTime 按钮将被启用。
这个问题我急了,删除 remoteHandle 确实禁用了按钮,但是你不能再从系统调用历史中调用了。
终于想出了一个完美的解决方案,分享一下。
假设我们同时支持 Audio/Video。
初始化
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()
}