本文档提供
AtomicXCore 的核心功能的集成指南,开发者使用 AtomicX 快速实现大型网络研讨会、企业全员大会或在线教育大班课的基础能力。开发者可完全自定义 UI 界面,专注于业务逻辑和用户体验的实现。标准会议与研讨会有何不同?
标准会议(Conference):适用于中小规模的多人协作场景,所有参与者均具有平等的音视频权限,提供屏幕共享、成员管理等完整互动能力。
研讨会(Webinar):专为大型直播演讲设计,支持无上限观众进房观看。观众可举手申请上台成为嘉宾后参与讨论,且系统针对万人级互动场景优化了消息并发性能,满足更专业的演讲互动需求。
功能展示
主持人 | 嘉宾 | 观众 |
支持主持人发起高清音视频推流与屏幕共享,支持对成员进行管理。 | 支持嘉宾开启麦克风进行实时语音讨论和分享。 | 支持观众无上限并发进房,以超低延迟观看实况并参与高频消息互动。支持观众通过“举手”功能向主持人申请变更为嘉宾。 |
![]() | ![]() | ![]() |
核心功能
通过
AtomicXCore,您可以快速获得构建专业研讨会场景所需的完整能力:双层角色体系: 房间内用户分为嘉宾(可音视频发言)和观众(仅观看),主持人可动态邀请观众上麦或将嘉宾移出发言席。
支持屏幕分享:在研讨会进行期间,主持人可将自己的屏幕内容实时共享给所有成员,以此辅助讲解并促进交流。
成员与权限管理: 包含嘉宾列表、观众列表展示,以及管理员设置、禁言/禁画等控场功能。
超大规模消息互动:针对万人级以上房间优化了消息削峰机制,确保超高并发量下的即时聊天和弹幕互动依然流畅稳定。
AtomicXCore 核心模块包含以下两个:RoomStore:房间管理功能入口,包含功能:创建房间、加入房间等。RoomParticipantStore:房间内成员功能入口, 包含功能:管理员设置、嘉宾观众管理、成员移出房间、嘉宾设备控制等。准备工作
步骤1:开通服务
注意:
研讨会场景基于底层的直播能力构建。请注意接入研讨会能力需要领取 TUILiveKit 体验版或开通 TUILiveKit 正式版,以确保相关功能的正常运行。
步骤2:环境要求
Xcode:需使用 Xcode 15 或更高版本。
iOS 系统:支持 iOS 14.0 或更高版本的设备。
CocoaPods 环境:已安装 CocoaPods 环境。如果您尚未安装,请参见 CocoaPods 官网安装,或按以下步骤操作:
使用 gem 安装 CocoaPods:在终端中执行
sudo gem install cocoapods 命令进行安装。提示:
sudo gem install cocoapods 安装过程中可能需要输入电脑密码,按提示输入管理员密码即可。步骤3:集成 AtomicXCore SDK
1. 添加 Pod 依赖:
在您项目的
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. 安装组件:
在终端中
cd 到 Podfile 文件所在的目录,然后执行以下命令安装组件。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 AtomicXCorefunc login() {LoginStore.shared.login(sdkAppID: 1400000001, // 替换为项目的 sdkAppIDuserID: "test_001", // 替换为项目的 userIDuserSig: "xxxxxxxxxxx") { result in // 替换为项目的 userSigswitch result {case .success(let info):debugPrint("login success")case .failure(let error):debugPrint("login failed code:\\(error.code), message:\\(error.message)")}}}
登录接口参数说明:
参数 | 类型 | 说明 |
sdkAppID | Int | |
userID | String | 当前用户的唯一 ID,仅包含英文字母、数字、连字符和下划线。为避免多端登录冲突,请勿使用 1、123 等简单 ID。 |
userSig | String | 注意: 开发环境:可以采用本地 GenerateTestUserSig.genTestSig 函数生成 userSig 或者通过 UserSig 辅助工具 生成临时的 UserSig。 生产环境:为了防止密钥泄露,请务必采用服务端生成 UserSig 的方式。详细信息请参考 服务端生成 UserSig。 |
搭建研讨会房间
步骤1:创建并加入研讨会房间
创建并加入房间具体流程如下,只需执行以下几步操作,即可快速搭建出研讨会房间。


提示:
1. 创建并加入房间
实现方式:
1.1 配置房间初始化参数:初始化
CreateRoomOptions 设置房间名称,房间配置。1.2 创建并加入房间:调用
RoomStore 的 createAndJoinRoom 接口执行核心操作。示例代码:
import UIKitimport AtomicXCore// RoomMainViewController 代表房间主视图控制器class RoomMainViewController: UIViewController {private var roomID = "webinar_123456"// 初始化视图控制器并自动创建并加入房间逻辑public init() {super.init(nibName: nil, bundle: nil)createAndJoinRoom(roomID: roomID, roomType: .webinar)}required init?(coder: NSCoder) {fatalError("init(coder:) has not been implemented")}// 调用此方法完成创建并加入房间的复合操作private func createAndJoinRoom(roomID: String, roomType: RoomType) {// 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, roomType: roomType, options: options) { [weak self] result inguard let self = self else { return }switch result {case .success():print("创建并加入研讨会房间成功")case .failure(let error):print("创建并加入研讨会房间失败 [错误码: \\(error.code)]: \\(error.message)")}}}}
createAndJoinRoom 接口参数详细说明
参数名 | 类型 | 必填 | 说明 |
roomID | String | 是 | 字符串类型的房间唯一标识符。 限制长度为 0-48 字节。 建议仅包含数字、英文字母(区分大小写)、下划线(_)和连字符(-)。避免使用空格和中文字符。 |
roomType | RoomType | 是 | 房间类型 standard:标准房间。webinar:大型研讨会房间。研讨会场景这里填写 webinar 房间类型. |
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 单例对象的 openLocalCamera、openLocalMicrophone 接口打开本地音视频设备采集,调用 startScreenShare 可以开启屏幕分享(屏幕分享时需要关闭摄像头)。import UIKitimport AtomicXCore// RoomMainViewController 代表房间主视图控制器class RoomMainViewController: UIViewController {private let roomID: Stringprivate static let kAppGroup = "group.com.RPLiveStreamRelease"public init(roomID: String) {self.roomID = roomIDsuper.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)// 3. 开始屏幕分享 (屏幕分享开启的时候需要关闭摄像头)// DeviceStore.shared.startScreenShare(appGroup: Self.kAppGroup)}}
注意:
研讨会模式下,移动端仅支持上行一路视频流,即开启摄像头的时候需要关闭屏幕分享,相应的开启屏幕分享的时候需要关闭摄像头推流。
openLocalCamera 接口参数详细说明
参数名 | 类型 | 必填 | 说明 |
isFront | Boolean | 是 | 是否开启前置摄像头。 true :开启前置摄像头。 false :开启后置摄像头。 |
completion | CompletionClosure | 否 | 操作完成回调,用于返回开启摄像头的结果。若开启失败则会返回错误码和错误信息。 |
3. 结束房间
当房主期望结束房间时,调用
RoomStore 的 endRoom 接口即可结束当前房间。结束房间后,房间内的所有成员都会收到房间结束事件。import UIKitimport AtomicXCore// RoomMainViewController 代表房间主视图控制器class RoomMainViewController: UIViewController {private let roomID: Stringpublic init(roomID: String) {self.roomID = roomIDsuper.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 inguard let self = self else { return }switch result {case .success():print("结束房间成功")case .failure(let error):print("结束房间失败 [错误码: \\(error.code)]: \\(error.message)")}}}}
步骤2:加入研讨会房间
1. 加入房间
需要加入房间时,调用
RoomStore 的 joinRoom 接口,即可加入房间。import UIKitimport AtomicXCore// RoomMainViewController 代表房间主视图控制器class RoomMainViewController: UIViewController {private let roomID = "webinar_123456"public init() {super.init(nibName: nil, bundle: nil)joinRoom(roomID: roomID, roomType: .webinar)}required init?(coder: NSCoder) {fatalError("init(coder:) has not been implemented")}/// 调用此方法加入一个已存在的房间private func joinRoom(roomID: String, roomType: RoomType) {// 1. 准备加入参数// joinRoom 适用于加入一个已知且正在进行的房间let targetRoomID = roomID // 目标房间 IDlet roomPassword = "" // 房间密码,若房间未设置密码则传空字符串或 nil// 2. 调用 RoomStore 加入房间接口// 该操作会验证房间是否存在、用户是否被禁入以及密码是否正确RoomStore.shared.joinRoom(roomID: targetRoomID, roomType: roomType, password: roomPassword) { [weak self] result inguard let self = self else { return }switch result {case .success():print("加入房间成功")case .failure(let error):print("加入房间失败 [错误码: \\(error.code)]: \\(error.message)")}}}}
joinRoom 接口参数详细说明
参数名 | 类型 | 必填 | 说明 |
roomID | String | 是 | 字符串类型的房间唯一标识符。 限制长度为 0-48 字节。 建议仅包含数字、英文字母(区分大小写)、下划线(_)和连字符(-)。避免使用空格和中文字符。 |
roomType | RoomType | 是 | 房间类型 standard:标准房间webinar:大型研讨会房间研讨会场景这里填写 webinar 房间类型。 |
password | String | 否 | 房间密码,空字符串 "" 通常表示该房间不设密码。 限制长度为 0-32 字节。 推荐使用 4-8 位纯数字,方便移动端输入。设置后,其他用户加入房间时需输入密码。建议不要存储明文敏感信息。 研讨会场景暂时不支持密码功能,这里可以填空。 |
completion | CompletionClosure | 否 | 操作完成回调,用于返回加入房间的结果。若加入房间失败则会返回错误码和错误信息。 |
2. 离开房间
当要离开房间时,通过调用
RoomStore 的 leaveRoom 接口即可离开房间。import UIKitimport AtomicXCore// RoomMainViewController 代表房间主视图控制器class RoomMainViewController: UIViewController {private let roomID: Stringpublic init(roomID: String) {self.roomID = roomIDsuper.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 inguard let self = self else { return }switch result {case .success():print("退出房间成功")case .failure(let error):print("退出房间失败 [错误码: \\(error.code)]: \\(error.message)")}}}}
步骤3:绑定视频画面视图
RoomView 组件已封装了研讨会的流媒体处理逻辑。开发者只需在页面中渲染 RoomView 组件,即可自动完成研讨会房间的音视频能力建设。视频渲染需要配合 TUIRoomKit 的组件来完成。RoomView 内置能力:主持人端:支持开启视频或屏幕分享。
嘉宾端:自动播放主持人的实时音视频流。
观众端:自动拉取并播放超低延迟直播流,确保海量并发下的观看体验。
提示:
import UIKitimport Combineimport AtomicXCoreimport TUIRoomKit// RoomMainViewController 代表房间主视图控制器class RoomMainViewController: UIViewController {private var roomID: Stringprivate var roomType: RoomTypeprivate lazy var roomView: RoomView = {let roomView = RoomView(roomID: roomID, roomType: roomType)return roomView}()init(roomID: String, roomType: RoomType) {self.roomID = roomIDself.roomType = roomTypesuper.init()view.addSubview(roomView)roomView.snp.makeConstraints { make inmake.edges.equalToSuperview()}}required init?(coder: NSCoder) { fatalError() }}
步骤4:实现嘉宾/观众角色管理
作为房主或管理员,调用
RoomParticipantStore 的 promoteAudienceToParticipant 接口可以将房间内的观众提升成为嘉宾。调用
demoteParticipantToAudience 接口可以将房间内的嘉宾降级成为观众。import Combineimport AtomicXCorefunc promoteAudienceToParticipant(userID: String) {// 前提:需要先完成进房操作。// 1. 业务逻辑说明// 通过进房的 roomID 创建 RoomParticipantStore 实例var participantStore: RoomParticipantStore = RoomParticipantStore.create(roomID: "webinar_123456")// 2. 调用 RoomParticipantStore 提升观众为嘉宾接口// 注意:只有房主或管理员才有权限执行此操作。participantStore.promoteAudienceToParticipant(userID: userID) { result inswitch result {case .success():print("提升为嘉宾成功")case .failure(let err):print("提升为嘉宾失败 错误码: \\(err.code), 错误信息: \\(err.message)")}}}func demoteParticipantToAudience(userID: String) {// 前提:需要先完成进房操作。// 1. 业务逻辑说明// 通过进房的 roomID 创建 RoomParticipantStore 实例var participantStore: RoomParticipantStore = RoomParticipantStore.create(roomID: "webinar_123456")// 2. 调用 RoomParticipantStore 降级嘉宾为观众接口// 注意:只有房主或管理员才有权限执行此操作。participantStore.demoteParticipantToAudience(userID: userID) { result inswitch result {case .success():print("降级嘉宾为观众成功")case .failure(let err):print("降级嘉宾为观众失败 错误码: \\(err.code), 错误信息: \\(err.message)")}}}
步骤5:监听房间内事件
进入房间完成后,通过调用
RoomStore 的 addRoomListener 可以订阅到 roomEventPublisher 中与房间相关的被动事件。import UIKitimport Combineimport AtomicXCore// RoomMainViewController 代表房间主视图控制器class RoomMainViewController: UIViewController {private let roomID: String// 用于存储 Combine 订阅关系,防止对象销毁导致监听失效private var cancellableSet = Set<AnyCancellable>()public init(roomID: String) {self.roomID = roomIDsuper.init(nibName: nil, bundle: nil)// 核心流程:在初始化时开启事件监听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 inguard let self = self else { return }// 2. 根据事件类型执行相应的业务逻辑switch event {case .onRoomEnded(let roomInfo):print("当前所在房间已结束")// ... 处理其他 RoomEvent 事件 ...default: break}}.store(in: &cancellableSet) // 3. 存储订阅关系}}
API 文档
常见问题
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 清理项目缓存,然后重新编译运行即可。
联系我们


