你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

将 CallKit 集成到 UI 库中

Azure 通信服务 UI 库为 CallKit 提供现式支持。 开发人员可提供自己的配置,便于 CallKit 用于 UI 库。

在本文中,了解如何在应用程序中使用 UI 库正确设置 CallKit。

先决条件

有关详细信息,请参阅开源 iOS UI 库示例应用程序代码

设置 CallKit 集成

Azure 通信服务通话 iOS SDK 支持 CallKit 集成。 可以通过配置 CallCompositeCallKitOption 的实例在 UI 库中启用此集成。 有关详细信息,请参阅与 CallKit 集成

为拨出电话指定呼叫接收方信息

若要指定拨出电话信息,请创建 CallKitRemoteInfo 的实例。 如果未提供 CallKitRemoteInfo,则默认会显示参与者标识符的原始值。

displayName 分配一个值,以自定义调用方的显示名称。 在 CallKitRemoteInfo 中指定的值正是它在上次拨号呼叫日志中的显示方式。

同时分配 cxHandle 值。 当用户重新调用该联系人时,应用程序会收到的内容。

let cxHandle = CXHandle(type: .generic, value: "VALUE_TO_CXHANDLE")
let callKitRemoteInfo = CallKitRemoteInfo(displayName: "DISPLAY_NAME", handle: cxHandle)
callComposite.launch(..., // Locator for Azure Communication Service
                     callKitRemoteInfo: callKitRemoteInfo)

为传入电话指定呼叫接收方信息

若要指定传入电话呼叫方信息,请创建 CallKitOptions 的实例。 如果未提供 CallKitOptions,则默认会显示参与者标识符的原始值。

provideRemoteInfo 分配一个值,以自定义调用方的显示名称。 在 CallKitRemoteInfo 中指定的值正是它在上次拨号呼叫日志中的显示方式。

同时分配 cxHandle 值。 当用户重新调用该联系人时,应用程序会收到的内容。

public func incomingCallRemoteInfo(info: Caller) -> CallKitRemoteInfo {
    let cxHandle = CXHandle(type: .generic, value: "VALUE_TO_CXHANDLE")
    var remoteInfoDisplayName = "DISPLAY_NAME"
    let callKitRemoteInfo = CallKitRemoteInfo(displayName: remoteInfoDisplayName,
                                                            handle: cxHandle)
    return callKitRemoteInfo
}

配置提供程序

根据需要,提供 CXProviderConfiguration 实例以进行 CallKitOptions。 有关详细信息,请参阅“有关 CXProviderConfiguration 的 Apple 开发人员文档”。

let providerConfig = CXProviderConfiguration()
providerConfig.supportsVideo = true
providerConfig.maximumCallGroups = 1
providerConfig.maximumCallsPerCallGroup = 1
providerConfig.includesCallsInRecents = true
providerConfig.supportedHandleTypes = [.phoneNumber, .generic]

配置音频会话

将音频会话配置为在拨打或接受传入电话之前以及恢复保持呼叫之前调用。 有关详细信息,请参阅“有关 AVAudioSession 的 Apple 开发人员文档”。

public func configureAudioSession() -> Error? {
    let audioSession = AVAudioSession.sharedInstance()
    let options: AVAudioSession.CategoryOptions = .allowBluetooth
    var configError: Error?
    do {
        try audioSession.setCategory(.playAndRecord)
    } catch {
        configError = error
    }
    return configError
}

启用 CallKit

若要启用 CallKit,请创建 CallKitOptions 的实例并将其提供给 callCompositeOptions

let isCallHoldSupported = true // enable call hold (default is true)
let callKitOptions = CallKitOptions(
    providerConfig: providerConfig,
    isCallHoldSupported: isCallHoldSupported,
    provideRemoteInfo: provideRemoteInfo,
    configureAudioSession: configureAudioSession
)

let options = CallCompositeOptions(
    ..., // Other options for Azure Communication Service
    callKitOptions: callKitOptions
)

在应用程序中集成的 CallKit 的保留和恢复 API

对于应用程序中集成的 CallKit,请使用 holdresume 来管理呼叫状态。

    callComposite.hold() { result in
        switch result {
            case .success:
                // success
            case .failure(let error):
                // failure
        }
    }

    callComposite.resume() { result in
        switch result {
            case .success:
                // success
            case .failure(let error):
                // failure
        }
    }

后续步骤