注意:集成提示:
注意:这篇档介绍基于 UI 组件 的开播方式(含完整交互 UI)。若你需通过 Core SDK 自行搭建主播端界面,请参考 主播开播 (Core SDK)。
一、功能概览
·开播前预览:支持主播开播前的房间名称、背景、视频预览、美颜调试、音效调试、布局模板等多种个性化配置。
·连麦互动:支持直播过程中与观众 或 与其他直播间主播实时互动。
·观众互动:支持弹幕、礼物等丰富直播互动形式。
·直播间管理:支持在线用户列表展示、以及直播间内的禁言、踢人等多种管理操作。
| 开播前预览 | 连麦互动 | 观众互动 | 直播间管理 |
| | | | |
三、步骤1:开通服务
参考 开通服务 文档开通「体验版」或「大规模直播版」套餐。
四、步骤2:代码集成
参考 准备工作 接入 TUILiveKit。
五、步骤3:添加开播前的准备页面
AnchorPrepareView 组件已内置了摄像头预览、音效设置、布局设置、以及其它功能设置,你需创建并加载主播开播页视图,具体示例代码如下:
Swiftimport UIKitimport Snapkitimport TUILiveKitimport AtomicXCore// YourAnchorPrepareViewController 代表你加载主播开播页的视图控制器class YourAnchorPrepareViewController: UIViewController { private let roomId = "testLiveId" // 懒加载 AnchorPrepareView private lazy var prepareView: AnchorPrepareView = { // AnchorPrepareView 初始化时传入roomId let view = AnchorPrepareView(roomId: roomId) return view }() public override func viewDidLoad() { super.viewDidLoad() // 将 prepareView 添加到视图上 view.addSubview(prepareView) prepareView.snp.makeConstraints { make in make.edges.equalToSuperview() } }}
六、步骤4:添加主播用的推流页面
AnchorView 组件已内置了音视频推流、观众连麦、直播互动、直播管理等功能,你只需创建并加载 AnchorView ,具体示例代码如下:
swiftimport UIKitimport Snapkitimport TUILiveKitimport AtomicXCore// YourAnchorPrepareViewController 代表你加载主播开播页的视图控制器class YourAnchorViewController: UIViewController { // 核心 view 组件 private let coreView: LiveCoreView // 声明 anchorView 实例 private let anchorView: AnchorView public init(liveInfo: LiveInfo, coreView: LiveCoreView? = nil, behavior: RoomBehavior = .createRoom) { if let coreView = coreView { self.coreView = coreView } else { self.coreView = LiveCoreView(viewType: .pushView) } // 实例化主播开播页 self.anchorView = AnchorView(liveInfo: liveInfo, coreView: self.coreView, behavior: behavior) super.init(nibName: nil, bundle: nil) } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } public override func viewDidLoad() { super.viewDidLoad() // 将 anchorView 添加到视图上 view.addSubview(anchorView) anchorView.snp.makeConstraints { make in make.edges.equalToSuperview() } }}
七、步骤5:事件回调定制
AnchorView 还提供了 delegate(AnchorViewDelegate)扩展点,用于监听主播开播页内的核心生命周期事件,包括真正开播成功、下播(含统计数据)、点击悬浮窗等回调,建议在 步骤 4 创建 AnchorView 后立即设置:
| 方法 | 说明 |
| func onStartLiving() | 主播已成功开始直播(房间创建/进入成功,推流已开始)时回调。 |
| func onEndLiving(state: AnchorState) | 主播下播时回调,state 携带本场直播的统计数据:totalDuration(直播时长)、totalViewers(观众总数)、totalMessageSent(弹幕总数)、totalGiftCoins(礼物总收益)、totalGiftUniqueSenders(送礼人数)、totalLikesReceived(点赞总数)、liveEndedReason(下播原因),可用于展示下播结算页。 |
| func onClickFloatWindow() | 用户点击悬浮窗回调。 |
import UIKitimport Snapkitimport TUILiveKitimport AtomicXCore// YourAnchorPrepareViewController 代表你加载主播开播页的视图控制器class YourAnchorViewController: UIViewController { // 核心 view 组件 private let coreView: LiveCoreView // 声明 anchorView 实例 private let anchorView: AnchorView public init(liveInfo: LiveInfo, coreView: LiveCoreView? = nil, behavior: RoomBehavior = .createRoom) { if let coreView = coreView { self.coreView = coreView } else { self.coreView = LiveCoreView(viewType: .pushView) } // 实例化主播开播页 self.anchorView = AnchorView(liveInfo: liveInfo, coreView: self.coreView, behavior: behavior) super.init(nibName: nil, bundle: nil) // 设置代理,监听主播页核心事件 anchorView.delegate = self } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } public override func viewDidLoad() { super.viewDidLoad() // 将 anchorView 添加到视图上 view.addSubview(anchorView) anchorView.snp.makeConstraints { make in make.edges.equalToSuperview() } }}// 实现 AnchorViewDelegate 回调代理extension YourAnchorViewController: AnchorViewDelegate { // 主播已成功开始直播(推流已开始) func onStartLiving() { } // 主播下播,state 携带本场直播的统计数据 func onEndLiving(state: AnchorState) { let duration = state.totalDuration let viewers = state.totalViewers let messageCount = state.totalMessageSent let giftCoins = state.totalGiftCoins let giftSenders = state.totalGiftUniqueSenders let likes = state.totalLikesReceived let reason = state.liveEndedReason // 可在此处跳转到你的下播结算页,展示以上统计数据 } // 用户点击了悬浮窗 func onClickFloatWindow() { }}// 实现 FloatWindowProvider 回调代理extension YourAnchorViewController: FloatWindowProvider { public func getRoomId() -> String { liveID } public func getOwnerId() -> String { LiveListStore.shared.state.value.currentLive.liveOwner.userID } public func getCoreView() -> AtomicXCore.LiveCoreView { coreView } public func relayoutCoreView() { anchorView.relayoutCoreView() } public func getIsLinking() -> Bool { let connectedSeats = CoGuestStore.create(liveID: liveID).state.value.connected let selfUserID = LoginStore.shared.state.value.loginUserInfo?.userID ?? "" return connectedSeats.contains(where: { $0.userID == selfUserID }) }}
八、步骤6:从准备页面跳转到推流页面
结合 步骤 3 实现 AnchorPrepareView 组件的代理事件,完成主播开播页的路由跳转,具体示例代码如下:
注意:配合服务端 (RESTFUL API) 开播:
注意:如果你的房间是先通过 服务端 API 创建的,在集成时无需修改任何代码逻辑,只需将示例代码中的 liveID 替换为服务端生成的 ID 即可。SDK 将自动接管该房间并开启直播。
swift
import UIKitimport TUILiveKitimport AtomicXCore// 在 AnchorPrepareView 初始化时设置代理class YourAnchorPrepareViewController: UIViewController { private lazy var prepareView: AnchorPrepareView = { let view = AnchorPrepareView(roomId: roomId) // 设置代理 view.delegate = self return view }()}// 实现 AnchorPrepareViewDelegate 回调代理extension YourAnchorPrepareViewController : AnchorPrepareViewDelegate { // 响应开播按钮点击事件 // – state: PrepareState 封装了主播开播页的摄像头、音效等功能设置,你只需按以下示例代码设置即可 public func onClickStartButton(state: PrepareState) { // 跳转到主播开播页 // 初始化直播信息 var liveInfo = LiveInfo(seatTemplate: .videoDynamicGrid9Seats) // 如果你使用了服务端 API 预创房,请在此处填入服务端返回的 RoomId。 liveInfo.liveID = roomId liveInfo.liveName = state.roomName liveInfo.coverURL = state.coverUrl liveInfo.isPublicVisible = state.privacyMode == .public liveInfo.backgroundURL = state.coverUrl // 实例化你的直播开播视图控制器 let anchorVC = YourAnchorViewController(liveInfo: liveInfo, coreView: prepareView.getCoreView()) anchorVC.modalPresentationStyle = .fullScreen // 跳转到你的直播开播视图控制器 present(anchorVC, animated: false) } // 响应返回按钮点击事件 public func onClickBackButton() { if let nav = navigationController { nav.popViewController(animated: true) } else { dismiss(animated: true) } }}
十、AI 助手:知识咨询与代码集成
你在接入直播与语聊 SDK 过程中,可以通过 MCP 使用 AI 助手,快速完成知识咨询、报错排查和集成代码生成。支持 Web/Android/iOS/Flutter/uni-app/HarmonyOS 等平台,答案基于产品文档。适用于查询 AtomicXCore SDK 和 UI 组件用法以及集成文档等场景,立即体验,提出你的第一个问题。
十一、自定义你的界面布局
TUILiveKit 支持灵活定制开播页与直播页的功能和样式,你可根据业务需求调整布局、隐藏 / 显示功能模块。
十二、直播布局模板选择
TUILiveKit 提供 4 种直播布局模板,你可在主播开播页的 UI 交互「布局」入口 选择合适样式:
十三、布局模板一览:
| 布局 | 动态宫格布局 | 浮动小窗布局 | 固定宫格布局 | 固定小窗布局 |
| 模板取值 | .videoDynamicGrid9Seats | .videoDynamicFloat7Seats | .videoFixedGrid9Seats | .videoFixedFloat7Seats |
| 描述 | 默认布局,可根据连麦人数动态调整宫格大小。 | 连麦嘉宾以浮动小窗形式显示。 | 连麦人数固定,每个嘉宾占据一个固定宫格。 | 连麦人数固定,嘉宾以固定小窗形式显示。 |
| 预览 | | | | |
十四、自定义开播页功能区
通过调用 步骤 3 创建的 prepareView 的 API,可自定义隐藏开播准备页的操作区或特定功能:
swiftimport UIKitimport Snapkitimport TUILiveKitimport AtomicXCore// YourAnchorPrepareViewController 代表你加载主播开播页的视图控制器class YourAnchorPrepareViewController: UIViewController { private let roomId = "testLiveId" private lazy var prepareView: AnchorPrepareView = { let view = AnchorPrepareView(roomId: roomId) view.delegate = self return view }() public override func viewDidLoad() { super.viewDidLoad() // 1. 将 prepareView 添加到视图上 view.addSubview(prepareView) prepareView.snp.makeConstraints { make in make.edges.equalToSuperview() } // 2. 自定义功能区 – 示例:隐藏美颜功能 prepareView.disableMenuBeauty(true) }}
| 隐藏整个功能区 | 隐藏美颜按钮 | 隐藏音效按钮 | 隐藏摄像头切换按钮 |
| disableFeatureMenu(true) | disableMenuBeauty(true) | disableMenuAudioEffect(true) | disableMenuSwitchCamera(true) |
| | | | |
十五、自定义主播直播页界面
·参考 主播核心页面 进行主播界面定制,在 AnchorView 中修改 UI 样式,添加你的业务组件。
·参考 调整视频直播挂件 进行视频位挂件定制,在 AnchorView 中修改视频位上的名称、头像挂件等 UI。
十六、文案定制
TUILiveKit 使用更为方便的 Apple Strings Catalog 工具来管理 UI 所需的文案显示,你可以很直观的通过 Xcode 视图化管理工具修改需要调整的文案:
注意:说明:
注意:Apple Strings Catalog (.xcstrings) 是在 Xcode 15 中引入的本地化格式。它增强了开发者管理本地化字符串的方式,支持处理复数、设备特定变体等的结构化格式。这种格式正成为管理 iOS 和 macOS 应用程序本地化的推荐方法。
十七、图标定制
TUILiveKit 使用 TUILiveKit.xcassets 管理 UI 所需的图片资源,你可以借助 Xcode 图形化工具快速修改自定义界面所需的图标。
十八、下一步
恭喜你,现在你已经成功集成了 主播开播 。接下来,你可以实现观众观看、直播列表、礼物系统等功能,可参考下表:
| 功能 | 描述 | 集成指引 |
| 观众观看 | 实现观众进入主播的直播间后观看直播,实现观众连麦 、直播间信息、在线观众、弹幕显示等功能。 | 观众观看 |
| 直播列表 | 展示直播列表界面和功能,包含直播列表,房间信息展示功能。 | 直播列表 |
| 礼物系统 | 实现自定义礼物素材配置、计费系统对接、PK 场景互动等功能。 | 礼物系统 |
20、开播后无画面?
请前往手机设置 > App > 相机,检查摄像头权限是否开启,可参考下图:
21、点击开播按钮无法开播,提示“未登录”?
参考 登录指引, 确认已完成登录功能接入。