接入概览(iOS)

最近更新时间:2026-01-29 10:43:51

我的收藏
本文档提供 AtomicXCore 的核心功能的集成指南,帮助开发者快速实现多人音视频房间功能。SDK 采用纯 API 架构设计,开发者可完全自定义 UI 界面,专注于业务逻辑和用户体验的实现。




核心功能

AtomicXCore 中用于搭建多人音视频房间场景所需要使用到的核心模块包含以下三个:
RoomStore:房间管理功能入口,包含功能:预定房间、创建房间、加入房间、房间内呼叫等。
RoomParticipantStore:房间内参与者功能入口, 包含功能:管理员设置、房主转移、踢出房间、参与者设备控制等。
RoomParticipantView:房间内参与者视频画面视图。

准备工作

步骤1:开通服务

请参见 开通服务,获取体验版或付费版 SDK。

步骤2:环境要求

Xcode:需使用 Xcode 15 或更高版本。
iOS 系统:支持 iOS 13.0 或更高版本的设备。
CocoaPods 环境:已安装 CocoaPods 环境。如果您尚未安装,请参见 CocoaPods官网安装,或按以下步骤操作:
使用 gem 安装 CocoaPods:在终端中执行 sudo gem install cocoapods 命令进行安装。
提示:
sudo gem install cocoapods 安装过程中可能需要输入电脑密码,按提示输入管理员密码即可。

步骤 3:集成 AtomicXCore SDK

1. 添加 Pod 依赖:
已有 Podfile 文件
没有 Podfile 文件
在您项目的 Podfile 文件中添加pod 'AtomicXCore' 依赖。例如:
target 'YourProjectTarget' do
# 其他已有的 Pod 依赖...
# 添加 pod 'AtomicXCore' 依赖
pod 'AtomicXCore'
end
在终端中通过 cd 命令切换到您的 .xcodeproj 目录下,然后执行 pod init 命令创建 Podfile 文件,创建完成后,在您的 Podfile 文件中添加 pod 'AtomicXCore' 依赖。例如:
# 如果您的项目目录是 /Users/yourusername/Projects/YourProject

# 1. cd 到您的.xcodeproj 工程目录下
cd /Users/yourusername/Projects/YourProject

# 2. 执行 pod init,此命令运行完后,会在您的工程目录下生成一个 Podfile 文件。
pod init

# 3. 在生成的 Podfile 文件中添加 pod 'AtomicXCore' 依赖
target 'YourProjectTarget' do
# 添加 pod 'AtomicXCore' 依赖
pod 'AtomicXCore'
end
2. 安装组件
在终端中 cdPodfile 文件所在的目录,然后执行以下命令安装组件。
pod install
3. 配置工程权限: 请在应用的 Info.plist 文件中添加相机和麦克风的使用权限说明。
<key>NSCameraUsageDescription</key>
<string>TUIRoomKit需要访问您的相机权限</string>
<key>NSMicrophoneUsageDescription</key>
<string>TUIRoomKit需要访问您的麦克风权限</string>


步骤4:实现登录逻辑

在项目中调用 LoginStore.shared.login 完成登录,这是使用 AtomicXCore 所有功能的关键前提
重要:
推荐在自身的用户账户登录成功后,再调用 LoginStore.shared.login,以确保登录业务逻辑的清晰和一致。
import AtomicXCore

func login() {
LoginStore.shared.login(sdkAppID: 1400000001, // 替换为项目的 sdkAppID
userID: "test_001", // 替换为项目的 userID
userSig: "xxxxxxxxxxx") { result in // 替换为项目的 userSig
switch result {
case .success(let info):
debugPrint("login success")
case .failure(let error):
debugPrint("login failed code:\\(error.code), message:\\(error.message)")
}
}
}
登录接口参数说明:
参数
类型
说明
sdkAppID
Int32
控制台 获取,通常是以 140160 开头的 10 位整数。
userID
String
当前用户的唯一 ID,仅包含英文字母、数字、连字符和下划线。为避免多端登录冲突,请勿使用 1123 等简单 ID
userSig
String
用于腾讯云鉴权的票据。更多信息请参见 如何计算及使用 UserSig
【注意事项】
开发环境:可以采用本地 GenerateTestUserSig.genTestSig 函数生成 userSig 或者通过 UserSig 辅助工具 生成临时的 UserSig。
生产环境:为了防止密钥泄露,请务必采用服务端生成 UserSig 的方式。详细信息请参考 服务端生成 UserSig

搭建基础多人房间

步骤1:房主创建并加入房间

创建并加入房间具体流程如下,只需执行以下几步操作,即可快速搭建出多人房间。



提示:
房主创建并加入房间的业务代码,可以参考 TUIRoomKit 开源项目中 RoomMainViewController.swiftRoomMainView.swift 文件来了解完整的实现逻辑。

1. 创建并加入房间

实现方式:
1.1 配置房间初始化参数:初始化CreateRoomOptions设置房间名称,房间密码。
1.2 房间权限预设:设置房间内全场成员权限,例如全体静音,全体禁画等。
1.3 创建并加入房间:调用RoomStorecreateAndJoinRoom接口执行核心操作。
示例代码:
import UIKit
import AtomicXCore

// RoomMainViewController 代表房间主视图控制器
class RoomMainViewController: UIViewController {
private let roomID: String

// 初始化视图控制器并自动启动房间逻辑
// - Parameter roomID: 目标房间的唯一 ID
public init(roomID: String) {
self.roomID = roomID
super.init(nibName: nil, bundle: nil)
createAndJoinRoom()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
// 调用此方法完成创建并加入房间的复合操作
private func createAndJoinRoom() {
// 1. 配置房间初始化参数
// CreateRoomOptions 用于定义房间的基础属性及初始权限控制
var options = CreateRoomOptions()
options.roomName = "我的讨论会" // 设置房间对外展示的名称
options.password = "" // 设置房间进入密码(若无需密码则留空)
// 2. 房间权限预设:在创建之初即可控制全场权限(通常用于正式会议场景)
options.isAllCameraDisabled = false // 全员开启/禁用摄像头的初始状态
options.isAllMessageDisabled = false // 全员开启/禁言的初始状态
options.isAllMicrophoneDisabled = false // 全员开启/静音的初始状态
options.isAllScreenShareDisabled = false // 全员禁止/允许屏幕分享的初始状态
// 3. 创建并加入房间
// 该方法是一个复合操作:若房间不存在则先创建,随后自动执行加入流程
RoomStore.shared.createAndJoinRoom(roomID: roomID, options: options) { [weak self] result in
guard let self = self else { return }
switch result {
case .success():
print("创建并加入房间成功")
case .failure(let error):
print("创建并加入房间失败 [错误码: \\(error.code)]: \\(error.message)")
}
}
}
}
createAndJoinRoom 接口参数详细说明
参数名
类型
必填
说明
roomID
String
字符串类型的房间唯一标识符。
限制长度为 0-48 字节。
建议仅包含数字、英文字母(区分大小写)、下划线(_)和连字符(-)。避免使用空格和中文字符。
options
CreateRoomOptions
创建房间配置对象。
详细用法请参考:CreateRoomOptions 结构体详细说明
completion
CompletionClosure
操作完成回调,用于返回创建和加入房间的结果。若创建失败则会返回错误码和错误信息。
CreateRoomOptions 结构体详细说明
参数名
类型
必填
说明
roomName
String
房间名称,可以不设置,默认为空字符串。
限制长度为 0-60 字节。
支持中英文、数字、特殊字符。
password
String
房间密码,空字符串 "" 通常表示该房间不设密码。
限制长度为 0-32 字节。
推荐使用 4-8 位纯数字,方便移动端输入。设置后,其他用户加入房间时需输入密码。建议不要存储明文敏感信息。
isAllMicrophoneDisabled
Bool
是否全员禁止打开麦克风。开启后,除房主/管理员外,普通参与者默认禁止打开麦克风。
true : 禁止
false :取消禁止 (默认值)
isAllCameraDisabled
Bool
是否全员禁止打开摄像头。开启后,除房主/管理员外,普通参与者默认禁止打开摄像头。
true : 禁止
false :取消禁止(默认值)
isAllScreenShareDisabled
Bool
是否全员禁止发起屏幕共享。开启后,仅房主/管理员可进行屏幕共享。
true : 禁止
false :取消禁止(默认值)
isAllMessageDisabled
Bool
是否全员禁止发送聊天消息(禁言)。开启后,普通参与者无法在房间内发送文字消息。
true : 禁止
false :取消禁言(默认值)

2.
打开摄像头和麦克风


进房成功后调用DeviceStore单例对象的openLocalCameraopenLocalMicrophone接口打开本地设备。
import UIKit
import AtomicXCore

// RoomMainViewController 代表房间主视图控制器
class RoomMainViewController: UIViewController {
private let roomID: String
public init(roomID: String) {
self.roomID = roomID
super.init(nibName: nil, bundle: nil)
openDevices()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
// 调用此方法打开设备
private func openDevices() {
// 1. 打开前置摄像头
DeviceStore.shared.openLocalCamera(isFront: true, completion: nil)
// 2. 打开麦克风
DeviceStore.shared.openLocalMicrophone(completion: nil)
}
}
openLocalCamera 接口参数详细说明
参数名
类型
必填
说明
isFront
Bool
是否开启前置摄像头。
true : 开启前置摄像头
false :开启后置摄像头
completion
CompletionClosure
操作完成回调,用于返回开启摄像头的结果。若开启失败则会返回错误码和错误信息。

3. 结束房间

当房主期望结束房间时,调用RoomStoreendRoom接口即可结束当前房间。结束房间后,房间内的所有参与者都会收到房间结束事件。
import UIKit
import AtomicXCore

// RoomMainViewController 代表房间主视图控制器
class RoomMainViewController: UIViewController {
private let roomID: String

public init(roomID: String) {
self.roomID = roomID
super.init(nibName: nil, bundle: nil)
endRoom()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
/// 调用此方法结束房间
private func endRoom() {
// endRoom 接口用于永久结束当前房间。
// 注意:通常该操作仅限房主(Owner)执行,执行后所有成员将被移出房间且音视频采集会强制停止。
RoomStore.shared.endRoom { [weak self] result in
guard let self = self else { return }
switch result {
case .success():
print("结束房间成功")
case .failure(let error):
print("结束房间失败 [错误码: \\(error.code)]: \\(error.message)")
}
}
}
}

步骤2:参与者加入房间

参与者加入房间,通过简单几步操作,即可实现与房间内其他参与者进行实时音视频互动。




1. 加入房间

参与者需要加入房间时,调用RoomStorejoinRoom接口,即可加入房间,此时房间内其他参与者会收到参与者加入房间事件通知。
import UIKit
import AtomicXCore

// RoomMainViewController 代表房间主视图控制器
class RoomMainViewController: UIViewController {
private let roomID: String
public init(roomID: String) {
self.roomID = roomID
super.init(nibName: nil, bundle: nil)
joinRoom()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
/// 调用此方法加入一个已存在的房间
private func joinRoom() {
// 1. 准备加入参数
// joinRoom 适用于加入一个已知且正在进行的房间
let targetRoomID = self.roomID // 目标房间 ID
let roomPassword = "" // 房间密码,若房间未设置密码则传空字符串或 nil
// 2. 调用 RoomStore 加入房间接口
// 该操作会验证房间是否存在、用户是否被禁入以及密码是否正确
RoomStore.shared.joinRoom(roomID: targetRoomID, password: roomPassword) { [weak self] result in
guard let self = self else { return }
switch result {
case .success():
print("加入房间成功")
case .failure(let error):
print("加入房间失败 [错误码: \\(error.code)]: \\(error.message)")
}
}
}
}

2. 打开摄像头和麦克风

代码示例可参考步骤

3. 离开房间

当参与者要离开房间时,通过调用RoomStoreleaveRoom接口即可离开房间,此时房间内其他参与者都会收到参与者离开房间事件通知。
import UIKit
import AtomicXCore

// RoomMainViewController 代表房间主视图控制器
class RoomMainViewController: UIViewController {
private let roomID: String
public init(roomID: String) {
self.roomID = roomID
super.init(nibName: nil, bundle: nil)
leaveRoom()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
/// 调用此方法主动退出当前房间
private func leaveRoom() {
// 1. 业务逻辑说明
// leaveRoom 接口用于普通成员或房主主动退出房间。
// 与 endRoom 不同,房主调用 leaveRoom 只会让自己离开,房间依然存在。
// 2. 调用 RoomStore 离开房间接口
// 该操作会停止音视频流传输,并通知服务器将当前用户移出房间
RoomStore.shared.leaveRoom { [weak self] result in
guard let self = self else { return }
switch result {
case .success():
print("退出房间成功")
case .failure(let error):
print("退出房间失败 [错误码: \\(error.code)]: \\(error.message)")
}
}
}
}

步骤3:绑定视频画面视图

AtomicXCore SDKRoomParticipantView 组件为开发者提供了完整的视频画面渲染解决方案。该组件支持本地摄像头画面和远端参与者视频流的实时显示,集成过程简单高效。



提示:
RoomParticipantView 是用于渲染房间参与者视频流的核心视图组件,若需要更灵活的视频组件布局方式,请参考 TUIRoomKit 开源项目中 RoomView.swift 文件来了解完整的实现逻辑。

实现方式:

1. 数据层订阅:订阅 RoomParticipantStore.state.participantList,建立参与者状态的响应式监听。
2. 状态自动同步:参与者列表变更时,系统自动更新 participantList 状态数据。
3. 视图初始化:根据参与者数据实例化 RoomParticipantView,绑定视频渲染逻辑。
4. UI 集成:完成视图层级集成、布局配置和渲染激活。

示例代码:

import UIKit
import Combine
import AtomicXCore


// RoomMainViewController 代表房间主视图控制器
class RoomMainViewController: UIViewController {
private var participantStore: RoomParticipantStore
private var cancellableSet = Set<AnyCancellable>()
private var views = [RoomParticipantView]()
init(roomID: String) {
participantStore = RoomParticipantStore.create(roomID: roomID)
super.init(nibName: nil, bundle: nil)
// 1. 数据层订阅
subscribeParticipantState()
participantStore.getParticipantList(cursor: "", completion: nil)
}
required init?(coder: NSCoder) { fatalError() }
private func subscribeParticipantState() {
participantStore.state.subscribe(StatePublisherSelector(keyPath: \\.participantList))
.receive(on: DispatchQueue.main)
.sink { [weak self] participantList in
guard let self = self else { return }
// 2. 状态自动同步
updateParticipantView(participantList)
}
.store(in: &cancellableSet)
}
private func updateParticipantView(_ list: [RoomParticipant]) {
views.forEach { view in
view.setActive(isActive: false)
view.removeFromSuperview()
}
views = Array(list.prefix(9)).enumerated().map { index, participant in
// 3. 视图初始化
let participantView = RoomParticipantView(streamType: .camera, participant: participant)
participantView.frame = CGRect(x: CGFloat(index % 3) * 125 + 10, y: CGFloat(index / 3) * 165 + 100, width: 120, height: 160)
// 4. UI 集成
view.addSubview(participantView)
participantView.setActive(isActive: true)
return participantView
}
}
}
RoomParticipantView 构造接口参数详细说明:
参数名
类型
必填
描述
streamType
VideoStreamType
需要渲染视频流的类型。
camera:摄像头流
screen:屏幕分享流
participant
RoomParticipant
房间内实时的参与者对象,涵盖了从基础身份到业务状态、再到底层音视频设备权限的所有关键信息。
详细用法请参考:RoomParticipant 结构体详细说明

RoomParticipant 结构体参数详细说明:

参数名
类型
必填
说明
userID
String
用户的唯一标识符。
userName
String
用户的昵称。
avatarURL
String
用户头像的 URL 地址。
nameCard
String
用户在房间内的名片/备注名。
限制长度为 0-32 字节。
支持设置中英文、数字、特殊字符。
role
ParticipantRole
房间参与者的成员角色。
owner:房主。
admin:管理员。
generalUser:普通用户(默认值)。
roomStatus
RoomParticipantStatus
成员在房间中的业务状态。
scheduled:已预约(默认值)。
inCalling:呼叫中。
callTimeout:呼叫超时。
callRejected:拒绝呼叫。
inRoom:在房间中。
microphoneStatus
DeviceStatus
麦克风设备的开启/关闭状态。
off:关闭(默认值)。
on:开启。
cameraStatus
DeviceStatus
摄像头设备的开启/关闭状态。
off:关闭(默认值)。
on:开启。
screenShareStatus
DeviceStatus
屏幕共享状态。
off:关闭(默认值)。
on:开启。
isMessageDisabled
Bool
是否被禁言。为 true 时无法发送聊天消息。
true: 禁止。
false:取消禁止(默认值)。
metaData
[String: Data]
业务自定义扩展数据,随参与者状态同步。
限制长度为 0-60 字节。仅支持 JSON 类型字符串。

步骤4:监听房间内事件

进入房间完成后,通过调用RoomStoreroomEventPublisher可以订阅到RoomEvent中与房间相关的被动事件。
import UIKit
import Combine
import AtomicXCore

// RoomMainViewController 代表房间主视图控制器
class RoomMainViewController: UIViewController {
private let roomID: String
// 用于存储 Combine 订阅关系,防止对象销毁导致监听失效
private var cancellableSet = Set<AnyCancellable>()
public init(roomID: String) {
self.roomID = roomID
super.init(frame: .zero)
// 核心流程:在初始化时开启事件监听
subscribeRoomEvents()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
/// 调用此方法订阅房间被动事件
private func subscribeRoomEvents() {
// 1. 访问 RoomStore 的 roomEventPublisher
// 该 Publisher 会推送房间全生命周期的事件,如呼叫、解散、预约提醒等
RoomStore.shared.roomEventPublisher
.receive(on: RunLoop.main) // 确保在主线程处理 UI 逻辑
.sink { [weak self] event in
guard let self = self else { return }
// 2. 根据事件类型执行相应的业务逻辑
switch event {
case .onRoomEnded(let roomInfo):
print("当前所在房间已结束")
// ... 处理其他 RoomEvent 事件 ...
default: break
}
}
.store(in: &cancellableSet) // 3. 存储订阅关系
}
}

运行效果

通过完成以上搭建步骤,您将得到一个纯净的多人视频渲染房间,但没有任何 UI 交互。
运行效果





丰富多人房间功能

为了满足对多人房间更多的需求,AtomicXCore SDK 还提供了以下功能来丰富多人房间场景。
多人房间功能
功能介绍
实现指南
实现更新房间信息功能
房主可以更新房间部分信息,例如:房间名称,房间密码。
实现会中呼叫功能
房主或管理员可以呼叫其他未进入房间的用户进房。
实现预定房间功能
可以提前预定好房间,支持设置房间开始时间,结束时间,添加参与者。
实现房间内成员管理功能
房主可以对房间内其他参与者进行管理,如:设置管理员,踢出参与者,对单个参与者音视频状态控制。

API 文档

Store/Component
功能描述
API文档
RoomStore
房间全生命周期管理:创建并加入 / 加入 / 离开 / 结束房间 / 更新、获取房间信息 / 预定房间 / 呼叫房间外成员 / 监听房间内被动事件(如房间解散,房间信息更新等)。
RoomParticipantStore
房间内参与者管理:设置管理员 / 转移房主 / 获取参与者列表 / 踢出房间 / 参与者设备控制(邀请打开摄像头、 麦克风等)/ 申请打开设备(例如申请打开摄像头、麦克风等)。
RoomParticipantView
单个参与者视频画面展示视图: 绑定和更新参与者信息 / 更新视频流类型 / 设置活跃状态等。

常见问题

RoomParticipantView 绑定了其他参与者信息,并正确设置了视频流类型,依然看不到视频画面?

检查 setActive:请确保当前 RoomParticipantView 在屏幕中是可见状态,并正确调用 RoomParticipantViewsetActive:true
检查 RoomParticipant: 请确保 RoomParticipantView 中设置的 RoomParticipant cameraStatus 状态是否为 on
检查网络:请检查设备网络连接是否正常。

rsync 因权限不足导致依赖第三方库资源拷贝失败

例如在使用 Xcode 集成 SnapKit 框架进行开发时,可能会遇到如下编译报错:
rsync(xxxx):1:1: SnapKit.framework/SnapKit_Privacy.bundle/: mkpathat: Operation not permitted

问题原因

Xcode 的用户脚本沙盒机制限制了构建过程中 rsync 脚本对 SnapKit.framework 资源文件的写入权限,导致框架内的 SnapKit_Privacy.bundle 无法正常拷贝。

解决步骤

1. 关闭用户脚本沙盒后,打开 Xcode 项目,进入项目的 Build Settings,搜索 User Script Sandboxing(或标识 ENABLE_USER_SCRIPT_SANDBOXING),将其值从 YES 修改为 NO
2. 清理并重新构建项目执行 Product → Clean Build Folder 清理项目缓存,然后重新编译运行即可。

联系我们

如果在接入或使用过程中有任何疑问或者建议,欢迎 联系我们 提交反馈。