LiveCommunicationManager 是一个用于管理 iOS VoIP 通话的单例管理器类。它集成了 Apple 的 PushKit 和 LiveCommunicationKit 框架,提供完整的 VoIP 通话解决方案,包括来电推送、通话管理和音频会话控制。
private func setupCallKit() {
let options = EMOptions(appkey: appKey)
#if DEBUG
options.apnsCertName = "your_APNS_Developer"
options.pushKitCertName = "yourVoipDev"
#else
options.apnsCertName = "your_APNS_Product"
options.pushKitCertName = "yourVoipPro"
#endif
EMClient.shared().initializeSDK(with: options)
//初始化环信CallKit
let config = EaseCallUIKit.CallKitConfig()
config.enableVOIP = true//开启voip功能后会自动开启LiveCommunicationKit,需要在develop.apple.com申请证书时勾选
config.enablePIPOn1V1VideoScene = true//开启画中画,同时需要开启应用后台摄像头采集权限,详见[PictureInPicture.md](./PictureInPicture.md)。
CallKitManager.shared.setup(config)
}- iOS 17.4 及更高版本
- Swift 5.0 及更高版本
- 必需框架:
- Foundation
- PushKit
- AVFAudio
- LiveCommunicationKit
- VoIP 权限: 确保应用已获得 VoIP 推送权限。
- 后台模式: 需要启用 Voice over IP 后台模式。
- 铃声文件: 确保
notes_of_the_optimistic音频文件存在。 - 线程安全: PushKit 回调在主线程执行。
- 内存管理: 通话结束后正确清理
ConversationManager。
你确保整个应用程序中只有一个实例管理所有通话相关功能。
static let shared = LiveCommunicationManager()调用 IM SDK 的接口绑定 VoIP 推送证书和推送 Token。EMClient 初始化时需绑定推送证书。
PKPushRegistry: 处理 VoIP 推送注册。PKPushRegistryDelegate: 响应推送事件。
关于如何创建 VoIP 推送证书以及上传至 环信控制台,详见 IM 的 APNs 离线推送文档。
创建 ConversationManager,进行如下配置:
- 铃声:
notes_of_the_optimistic。 - 图标: 使用应用图标。
- 限制: 最大会话组数 为
1,每组最大会话数 为1。
ConversationManager 提供如下功能:
- 上报来电通知。
- 管理通话生命周期:接听、挂断、静音等。
- 通话超时处理。
- 接收 VoIP 推送通知
- 解析推送载荷提取通话信息
- 创建 ConversationManager(如不存在)
- 生成或使用现有呼叫 UUID
- 报告新的来电会话
- 更新 CallKitManager 状态
推送通知载荷应包含以下字段:
{
"e": {
"callId": "通话ID",
"callerNickname": "来电者昵称"
},
"f": "来电者ID",
"m": "消息ID(可选)",
"g": "群组ID(可选)"
}- 用户点击接听
- 执行
JoinConversationAction - 调用 CallKitManager.accept()
- 显示连接中提示
- 用户点击挂断
- 执行
EndConversationAction - 调用 CallKitManager.hangup()
- 清理会话资源
- 用户切换静音状态
- 执行
MuteConversationAction - 更新本地音频状态
| 错误场景 | 描述 |
|---|---|
| UUID 创建失败 | 自动生成新的呼叫 UUID。 |
| 通话信息缺失 | 日志记录错误,拒绝接听呼叫。 |
| 状态不匹配 | 验证通话状态后再执行操作。 |
| 超时处理 | 无论主叫或被叫超时,通话都自动取消。 |
- 初始化 PushKit。
LiveCommunicationManager.shared.setupPushKit()- 创建会话管理器
ConversationManager。
LiveCommunicationManager.shared.createConversationManager()- 上报来电。
LiveCommunicationManager.shared.reportIncomingCall(
uuid: UUID(),
callerName: "来电者名称"
)- 结束通话。
LiveCommunicationManager.shared.endCall()



