6

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

我可以通过设置supportsVideofalsein来禁用视频按钮CXProviderConfiguration。现在出现了 FaceTime 按钮。

我想知道是否有办法在默认 UI 中禁用 FaceTime 按钮,因为该应用正在处理与 FaceTime 无关的内部企业号码。


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


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


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

4

4 回答 4

8

我为这个问题拔了头发,删除 remoteHandle 确实禁用了按钮,但你不能再从系统调用历史记录中拨打电话了。

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

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

  1. 初始化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. 重要的!结束通话时更新remoteHandle,在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()
} 
于 2018-04-04T23:16:20.507 回答
5

在好消息/坏消息方面,我能够通过清除remoteHandle(未删除或隐藏,只是变灰)来禁用 FaceTime 按钮。

但是,作为副作用,如果您不设置localizedCallerName. 没有句柄的呼叫将具有在“最近”中不可按下的副作用。 CXCallUpdate

CXCallUpdate *callUpdate = [[CXCallUpdate alloc] init];
//callUpdate.remoteHandle = [[CXHandle alloc] initWithType:CXHandleTypeGeneric value:handle];
[self.provider reportNewIncomingCallWithUUID:uuid update:callUpdate completion:^(NSError* error) {}];
于 2016-12-20T21:59:51.093 回答
1

我按照与禁用“添加呼叫”按钮相同的方法禁用了 FaceTime 按钮,这不会破坏来电者姓名功能,但奇怪的是,如果用户触摸扬声器按钮,FaceTime 按钮会再次变为活动状态。我不明白为什么这种行为不是 Apple 的错误,所以我放弃了适当的修复。

编辑:原因如下:我将 a 归因CXHandleCXCallUpdate唯一一次建立呼叫,所以起初 FaceTime 按钮被禁用,因为没有CXHandle. 激活扬声器按钮以某种方式强制更新 CallKit UI - 此时,CXHandle已经存在一个,因此 FaceTime 按钮将被启用。

于 2017-01-09T01:42:04.857 回答
0

正如@Eli Burke 所说,它可以通过清除remoteHandle 来真正禁用FaceTime 按钮,但副作用是禁用来自Recents 的呼叫。我不知道为什么。

于 2016-12-23T08:52:52.870 回答