Swift中 CXCallUpdate对外拨打的呼叫不起作用

移动开发 2026-07-11

我使用下面的代码开始一个外拨通话。

let handle = CXHandle(type: .generic, value: handleValue)
let startCallAction = CXStartCallAction(call: uuid, handle: handle)
        let transaction = CXTransaction(action: startCallAction)

        self.pendingCallData[uuid] = conference

        callKitCallController.request(transaction) { error in
            if let error = error {
                print("StartCallAction transaction request failed: \(error.localizedDescription)")
            } else {
                print("StartCallAction transaction request successful")
            }
        }

起初,在开始外拨时,我将被叫方的电话号码设为 CXHandle 的值。

通话发起后,用户可以添加更多参与者(即变成群组通话)。此时,我需要将 remoteHandle 更新为存储一个 呼叫ID,而不是原来的电话号码。这样,当用户从设备的最近通话记录中点击该通话时,我就可以检索呼叫ID并重新发起该群组通话。

然而,对于外拨通话,更新 remoteHandle 似乎并不起作用,它始终保留初始值(电话号码)。有趣的是,这在接听来电时却按预期工作。

下面是我用于更新句柄的代码:

let update = CXCallUpdate()
update.remoteHandle = CXHandle(type: .generic, value: conference.id)
SharedCallKitProvider.shared.reportCall(with: callUUID, updated: update)
@MainActor
enum SharedCallKitProvider {
    private static var _provider: CXProvider?

    static var shared: CXProvider {
        if let existing = _provider { return existing }
        let config = CXProviderConfiguration()
        config.supportsVideo = false
        config.maximumCallGroups = 1
        config.maximumCallsPerCallGroup = 1
        config.iconTemplateImageData = UIImage(named: "truck")?.pngData()
        config.supportedHandleTypes = [.generic,.phoneNumber]
        let provider = CXProvider(configuration: config)
        _provider = provider
        return provider
    }
}

解决方案

据我所知,这就是CallKit的设计方式。CXCallUpdate 对于外拨通话并不太灵活,技术上更偏向于处理来电更新。

一旦你开始 CXStartCallAction 并传入 CXHandle,iOS会将其设为最终身份;之后如果你尝试修改 remoteHandle,系统就会忽略。

亦可参阅Apple文档 https://developer.apple.com/documentation/callkit/cxstartcallaction

初始化一个新操作,以指定的UUID启动对具有指定句柄的接收方的通话。

因此最好的做法是在开始时就设置正确的标识符,例如callID或 conferenceID。这样你就不需要在后续再修改;否则你也可以尝试断开通话并通过传入新的ID重新初始化(不过不推荐,因为这会破坏用户体验)。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章