TUILiveKit 主播开播页为直播场景提供开箱即用的全功能界面,支持快速搭建主播开播所需的核心能力,让您无需关注复杂 UI 与逻辑实现,即可高效集成直播开播流程。
集成提示:
功能概览
开播前预览:支持主播开播前的房间名称、背景、视频预览、美颜调试、音效调试、布局模板等多种个性化配置。
连麦互动:支持直播过程中与观众 或 与其他直播间主播实时互动。
观众互动:支持弹幕、礼物等丰富直播互动形式。
直播间管理:支持在线用户列表展示、以及直播间内的禁言、踢人等多种管理操作。
开播前预览 | 连麦互动 | 观众互动 | 直播间管理 |
![]() | ![]() | ![]() | ![]() |
快速接入
步骤1:开通服务
步骤2:代码集成
步骤3:添加开播前的准备页面
AnchorPrepareView 组件已内置了摄像头预览、音效设置、布局设置、以及其它功能设置,您需创建并加载主播开播页视图,具体示例代码如下:import UIKitimport Snapkitimport TUILiveKitimport AtomicXCore// YourAnchorPrepareViewController 代表您加载主播开播页的视图控制器class YourAnchorPrepareViewController: UIViewController {private let roomId = "testLiveId"// 懒加载 AnchorPrepareViewprivate lazy var prepareView: AnchorPrepareView = {// AnchorPrepareView 初始化时传入roomIdlet view = AnchorPrepareView(roomId: roomId)return view}()public override func viewDidLoad() {super.viewDidLoad()// 将 prepareView 添加到视图上view.addSubview(prepareView)prepareView.snp.makeConstraints { make inmake.edges.equalToSuperview()}}}
步骤4:添加主播用的推流页面
AnchorView 组件已内置了音视频推流、观众连麦、直播互动、直播管理等功能,您只需创建并加载 AnchorView ,具体示例代码如下:import UIKitimport Snapkitimport TUILiveKitimport AtomicXCore// YourAnchorPrepareViewController 代表您加载主播开播页的视图控制器class YourAnchorViewController: UIViewController {// 核心 view 组件private let coreView: LiveCoreView// 声明 anchorView 实例private let anchorView: AnchorViewpublic 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 inmake.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: AnchorViewpublic 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 inmake.edges.equalToSuperview()}}}// 实现 AnchorViewDelegate 回调代理extension YourAnchorViewController: AnchorViewDelegate {// 主播已成功开始直播(推流已开始)func onStartLiving() {}// 主播下播,state 携带本场直播的统计数据func onEndLiving(state: AnchorState) {let duration = state.totalDurationlet viewers = state.totalViewerslet messageCount = state.totalMessageSentlet giftCoins = state.totalGiftCoinslet giftSenders = state.totalGiftUniqueSenderslet likes = state.totalLikesReceivedlet 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.connectedlet selfUserID = LoginStore.shared.state.value.loginUserInfo?.userID ?? ""return connectedSeats.contains(where: { $0.userID == selfUserID })}}
步骤6:从准备页面跳转到推流页面
配合服务端 (RESTFUL API) 开播:
import UIKitimport TUILiveKitimport AtomicXCore// 在 AnchorPrepareView 初始化时设置代理class YourAnchorPrepareViewController: UIViewController {private lazy var prepareView: AnchorPrepareView = {let view = AnchorPrepareView(roomId: roomId)// 设置代理view.delegate = selfreturn view}()}// 实现 AnchorPrepareViewDelegate 回调代理extension YourAnchorPrepareViewController : AnchorPrepareViewDelegate {// 响应开播按钮点击事件// - state: PrepareState 封装了主播开播页的摄像头、音效等功能设置,您只需按以下示例代码设置即可public func onClickStartButton(state: PrepareState) {// 跳转到主播开播页// 初始化直播信息var liveInfo = LiveInfo(seatTemplate: .videoDynamicGrid9Seats)// 如果您使用了服务端 API 预创房,请在此处填入服务端返回的 RoomId。liveInfo.liveID = roomIdliveInfo.liveName = state.roomNameliveInfo.coverURL = state.coverUrlliveInfo.isPublicVisible = state.privacyMode == .publicliveInfo.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)}}}
自定义您的界面布局
TUILiveKit 支持灵活定制开播页与直播页的功能和样式,您可根据业务需求调整布局、隐藏 / 显示功能模块。直播布局模板选择
TUILiveKit 提供 4 种直播布局模板,您可在主播开播页的 UI 交互「布局」入口 选择合适样式:
布局模板一览:
布局 | 动态宫格布局 | 浮动小窗布局 | 固定宫格布局 | 固定小窗布局 |
模板取值 | .videoDynamicGrid9Seats | .videoDynamicFloat7Seats | .videoFixedGrid9Seats | .videoFixedFloat7Seats |
描述 | 默认布局,可根据连麦人数动态调整宫格大小。 | 连麦嘉宾以浮动小窗形式显示。 | 连麦人数固定,每个嘉宾占据一个固定宫格。 | 连麦人数固定,嘉宾以固定小窗形式显示。 |
预览 | ![]() | ![]() | ![]() | ![]() |
自定义开播页功能区
import UIKitimport Snapkitimport TUILiveKitimport AtomicXCore// YourAnchorPrepareViewController 代表您加载主播开播页的视图控制器class YourAnchorPrepareViewController: UIViewController {private let roomId = "testLiveId"private lazy var prepareView: AnchorPrepareView = {let view = AnchorPrepareView(roomId: roomId)view.delegate = selfreturn view}()public override func viewDidLoad() {super.viewDidLoad()// 1. 将 prepareView 添加到视图上view.addSubview(prepareView)prepareView.snp.makeConstraints { make inmake.edges.equalToSuperview()}// 2. 自定义功能区 - 示例:隐藏美颜功能prepareView.disableMenuBeauty(true)}}
隐藏整个功能区 | 隐藏美颜按钮 | 隐藏音效按钮 | 隐藏摄像头切换按钮 |
disableFeatureMenu(true) | disableMenuBeauty(true) | disableMenuAudioEffect(true) | disableMenuSwitchCamera(true) |
![]() | ![]() | ![]() | ![]() |
自定义主播直播页界面
参考 主播核心页面 进行主播界面定制,在
AnchorView 中修改 UI 样式,添加您的业务组件。参考 调整视频直播挂件 进行视频位挂件定制,在
AnchorView 中修改视频位上的名称、头像挂件等 UI。文案定制
说明:
Apple Strings Catalog (.xcstrings) 是在 Xcode 15 中引入的本地化格式。它增强了开发者管理本地化字符串的方式,支持处理复数、设备特定变体等的结构化格式。这种格式正成为管理 iOS 和 macOS 应用程序本地化的推荐方法。

图标定制
TUILiveKit 使用 TUILiveKit.xcassets 管理 UI 所需的图片资源,您可以借助 Xcode 图形化工具快速修改自定义界面所需的图标。
下一步
恭喜您,现在您已经成功集成了 主播开播 。接下来,您可以实现观众观看、直播列表、礼物系统等功能,可参考下表:
常见问题
开播后无画面?
请前往手机设置 > App > 相机,检查摄像头权限是否开启,可参考下图:












