LiveCoreView (iOS UIKit)

最近更新时间:2025-09-08 22:59:43

我的收藏
LiveCoreView 是一个跨平台的视频直播核心组件,提供了直播中的关键能力,例如开播、观看、连麦和主播 PK。通过集成 LiveCoreView,您可以在短时间内快速搭建直播主流程,并在此基础上添加您自己的业务 UI 视图,实现高度定制化的直播应用。

效果展示

主播开播预览
观众观看
主播连麦





环境准备

Xcode 15 及以上。
iOS 13.0 及以上。
CocoaPods 环境安装,点击查看

组件接入

步骤 1:开通服务

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

步骤 2:集成与配置

1. 添加依赖:请在您的 Podfile 文件中添加 pod 'LiveStreamCore' 依赖。
Swift
target 'xxxx' do
...
...
pod 'LiveStreamCore'
end
2. 安装组件:在终端中 cdPodfile 所在的目录,然后执行以下命令来安装组件。
pod install

步骤 3:登录

在您的项目中调用 TUIRoomEngine.login 方法完成登录。这是使用 LiveCoreView 所有功能的关键前提。
Swift
//
// AppDelegate.swift
//

import RTCRoomEngine

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
TUIRoomEngine.login(sdkAppId: 1400000001, // 请替换为步骤一取到的 SDKAppID
userId: "denny", // 请替换为您的 UserID
userSig: "xxxxxxxxxxx") { // 您可以在控制台中计算一个 UserSig 并填在这个位置
print("login success")
} onError: { code, message in
print("login failed, code: \\(code), error: \\(message ?? "nil")")
}
return true
}
登录接口参数说明
参数
类型
说明
SDKAppID
int
控制台获取。
UserID
String
当前用户的唯一 ID,仅包含英文字母、数字、连字符和下划线。
userSig
String
用于腾讯云鉴权的票据。请注意:
开发环境:您可以采用本地 GenerateTestUserSig.genTestSig 函数生成 userSig 或者 通过 UserSig 辅助工具 生成临时的 UserSig。
生产环境:为了防止密钥泄露,请务必采用服务端生成 UserSig 的方式。详细信息请参考 服务端生成 UserSig
更多信息请参见 如何计算及使用 UserSig

组件使用

所有直播功能都通过 LiveCoreView 实现。

主播预览与开播

1. 创建核心控件
Swift
import LiveStreamCore

let liveCoreView = LiveCoreView()
2. 开启直播预览
调用 startCamera 方法,开启本地摄像头的预览。这并不会真正开启直播间。
Swift
import LiveStreamCore

liveCoreView.startCamera(useFrontCamera: true{
} onError: { code, message in
}
3. 开启直播间
调用 startLiveStream 方法,开启一个直播间并将本地音视频流推送到直播间。您可以通过 liveInfo.seatLayoutTemplateId 设置布局样式:
Swift
import LiveStreamCore
import RTCRoomEngine

let liveInfo = TUILiveInfo()
liveInfo.roomId = "123456"
liveInfo.seatMode = .applyToTake
/**
选择布局:如果要选择其他布局开播,设置 liveInfo.seatLayoutTemplateId = 600
600: 动态宫格布局(默认)
601: 浮动小窗布局
800: 固定宫格布局
801: 固定小窗布局
*/
liveInfo.seatLayoutTemplateId = 600

liveCoreView.startLiveStream(liveInfo: liveInfo) { roomInfo in
} onError: { code, message in
}

liveCoreView.startMicrophone {
} onError: { code, message in
}
布局样式示例:
600 动态宫格布局
601 浮动小窗布局
800 固定宫格布局
801 固定小窗布局





观众观看

观众通过调用 joinLiveStream 方法进入直播间,并拉取主播的音视频流。
Swift
import LiveStreamCore

let liveCoreView = LiveCoreView()
liveCoreView.joinLiveStream(roomId: "roomId_123456") { roomInfo in
} onError: { code, message in
}

观众连麦

以下是以观众向主播发起连麦为例的典型流程。观众连麦效果预览:
单人连麦
多人连麦






1. 观众发送连麦请求
观众调用 requestIntraRoomConnection 向主播发送连麦请求。
Swift
let timeout = 60
let userId = "anchorUserId" // 修改为房主的UserId,传入空字符串时默认为房主UserId
liveCoreView.requestIntraRoomConnection(userId: userId, timeOut: timeOut, openCamera: true) {
} onError: { code, message in
}
2. 主播端收到连麦请求
主播在 onUserConnectionRequest 回调中收到观众的连麦请求。
Swift
func onUserConnectionRequest(inviterUser: TUIUserInfo) {
print("收到观众连线请求:\\(inviterUser.userId)")
}
3. 主播响应连麦请求
3.1 主播调用 respondIntraRoomConnection 同意或拒绝连麦。
Swift
// 主播同意连麦
liveCoreView.respondIntraRoomConnection(userId: audienceBUserId, isAccepted: true) {
} onError: { code, message in
}
3.2 观众在 onUserConnectionAcceptedonUserConnectionRejected 回调中收到主播的响应。
Swift
func onUserConnectionAccepted(userId: String) {
print("主播同意连线:\\(userId)")
}
4. 断开连麦
主播挂断观众连麦:
观众 B 和主播 A 连麦成功后,主播 A 断开和观众 B 的连麦。
Swift
let userId = "audienceBUserId"
liveCoreView.disconnectUser(userId: userId) {
} onError: { code, message in
}
主播 A 断开和观众 B 的连麦请求后,观众 B 会收到 onUserConnectionTerminated 回调。
Swift
func onUserConnectionTerminated() {
print("主播关闭连线")
}
观众主动结束连麦:
观众 B 和主播 A 连麦成功后,观众 B 主动断开连麦可以调用 terminateIntraRoomConnection。
Swift
liveCoreView.terminateIntraRoomConnection()
当观众 B 主动断开连麦时,主播会收到 onUserConnectionExited 回调。
Swift
func onUserConnectionExited(userInfo: TUIUserInfo) {
print("观众退出连线")
}

主播连线

主播连线效果预览:
双主播连线
多主播连线






您可以按如下 API 来完成主播连线功能。这里以主播 A 与主播 B 连线为例实现如下,以下是主播 A 向主播 B 发起跨房连线的典型流程。
说明:
以下是由 LiveCoreView 提供的主动调用方法。
所有的回调方法是指 LiveCoreView 设置的 ConnectionObserver 对象中的回调方法。
1. 主播 A 发起连线
主播 A 调用 requestCrossRoomConnection 发起连线,传入主播 B 的房间 ID。
主播 A 可通过 onCrossRoomConnectionAccepted 接收请求同意回调。
Swift
let roomId = "anchorRoomId"

liveCoreView.requestCrossRoomConnection(roomId: roomId, timeOut: 60) {
} onError: { code, message in
}
2. 主播 B 收到连线请求
主播 B 在 onCrossRoomConnectionRequest 回调中收到连线请求。
Swift
func onCrossRoomConnectionRequest(hostUser: TUIConnectionUser) {
print("收到主播A连线房间请求:\\(hostUser.userId)")
}
3. 主播 B 响应连线请求
主播 B 调用 respondToCrossRoomConnection 响应连线。
Swift
liveCoreView.respondToCrossRoomConnection(roomId: roomId, isAccepted: true) {
} onError: { code, message in
}
4. 退出连线
主播 B 调用 terminateCrossRoomConnection 退出连线。
Swift
liveCoreView.terminateCrossRoomConnection()

主播 PK

LiveCoreView 提供了主播 PK 相关的 API , 由于每种 PK 玩法的 UI 都不一样,所以LiveCoreView 只提供 API ,您需要自己完成 UI 效果的实现。
主播 PK 效果预览:
双主播PK
多主播PK






说明:
PK 功能依赖于连线功能,所以您需要在主播连线的情况下才能发起 PK请求
以下主动调用 API 是由 LiveCoreView 提供。
所有的回调方法是指 LiveCoreView 设置的 BattleObserver 对象中的回调方法。
您可以按如下 API 来完成主播PK功能。这里以主播 A 与主播 B PK 为例实现如下。
1. 主播 A 发起 PK
主播 A 调用 requestBattle 发起 PK。
主播 A 可通过 onBattleRequestAccept 接收 PK 同意回调。
Swift
let roomId = "anchorRoomId"
let config = TUIBattleConfig()
config.duration = battleDuration
config.needResponse = true
config.extensionInfo = ""

let userIdList: [String] = []
let timeout: TimeInterval = 10

liveCoreView.requestBattle(config: config, userIdList: userIdList, timeout: timeout) {
[weak self] (battleId, battleUserList) in
} onError: { _, _ in
}
2. 主播 B 收到 PK 请求
主播 B 通过 onBattleRequestReceived 接收 PK 请求回调。
Swift
extension ViewContrller: BattleObserver { //替换为您真实的类名
func onBattleRequestReceived(battleId: String, inviter: TUIBattleUser, invitee: TUIBattleUser) {
}
}
3. 主播 B 响应 PK 请求
主播 B 通过调用 respondToBattle 响应 PK 请求。
Swift
liveCoreView.respondToBattle(battleId: manager.battleState.battleId, isAccepted: false, onSuccess: { [weak self] in
}, onError: { _, _ in
})
主播 A、B 以及房间内观众收到 onBattleStarted,收到 PK 开始通知。
Swift
extension ViewContrller: BattleObserver { //替换为您真实的类名
func onBattleStarted(battleInfo: TUIBattleInfo)) {
}
}
4. 退出 PK 流程
自然结束:当 PK 时间截止时,会收到 onBattleEnded 回调。
主动停止:主播 B 调用 terminateBattle 自己会退出 PK,主播 A 会收到 onUserExitBattle
Swift
liveCoreView.terminateBattle(battleId: manager.battleState.battleId) {
} onError: { _, _ in
}