CoHostStore
简介
跨房连线功能允许不同直播间的主播进行实时互动。CoHostStore 提供了一套全面的 API 来管理整个跨房连线生命周期。
重要:
请始终使用工厂方法 create(liveID:) 并提供有效的直播间 ID 来创建 CoHostStore 实例。不要尝试直接初始化。
说明:
连线状态更新通过 state 发布者传递。订阅它以接收有关连线状态、已连接主播、邀请和申请的实时更新。
警告:
如果连线请求在指定的超时时间内未收到响应,将触发超时事件。请始终在 UI 中处理超时场景。
功能特性
双向连线:主播可以向其他主播发起连线请求,也可以接收其他主播的连线请求。
状态管理:实时跟踪连线状态、已连接主播、邀请列表和申请者。
事件驱动架构:提供连线事件流用于监听各种连线状态变化。
布局模板:支持多种连线布局模板,如动态网格布局和1对6布局。
可订阅数据
CoHostState 的字段描述如下:
属性名 | 类型 | 描述 |
coHostStatus | 跨房连线的实时状态。 | |
connected | 正在和当前直播间连线的主播列表。 | |
invitees | 向其他直播间发出请求的主播列表。 | |
applicant | 向当前直播间发起连线请求的主播。 | |
candidatesCursor | String | 推荐用户列表游标。 |
candidates | 推荐用户列表。 |
API 列表
函数名 | 描述 |
创建对象实例。 | |
连线事件发布者。 | |
发起连线请求。 | |
取消连线请求。 | |
接受连线请求。 | |
拒绝连线请求。 | |
退出连线。 | |
获取推荐主播列表。 |
创建实例
create
创建 CoHostStore 实例
public static func create(liveID: String) -> CoHostStore {let store: CoHostStoreImpl = StoreFactory.shared.getStore(liveId: liveID)return store}
版本信息
从 3.5 版本开始支持。
参数说明
参数名 | 类型 | 是否必填 | 描述 |
liveID | String | 必填 | 直播间ID。 |
观察状态和事件
coHostEventPublisher
连线事件发布者
连线操作
requestHostConnection
发起主播连线请求
public func requestHostConnection(targetHost liveId: String,layoutTemplate: CoHostLayoutTemplate,timeout: TimeInterval,extraInfo: String = "",completion: CompletionClosure?){fatalError("\(#function) must be overridden by subclass")}
向目标主播发起跨房连线请求。
调用此方法后,会向目标主播发送连线请求。请求将保持活动状态,直到:
• 目标主播通过 acceptHostConnection(fromHostLiveID:completion:) 接受
• 目标主播通过 rejectHostConnection(fromHostLiveID:completion:) 拒绝
• 超时时间到期
• 您通过 cancelHostConnection(toHostLiveID:completion:) 取消
版本信息
从 3.5 版本开始支持。
参数说明
参数名 | 类型 | 是否必填 | 描述 |
liveId | String | 必填 | 目标主播的直播间ID。 |
layoutTemplate | 必填 | 连线布局模板。 | |
timeout | TimeInterval | 必填 | 请求超时时间(单位:秒)。 |
extraInfo | String | 必填 | 扩展信息。 |
completion | 必填 | 发起请求成功的回调。 |
cancelHostConnection
取消主播连线请求
public func cancelHostConnection(toHostLiveID: String, completion: CompletionClosure?) {fatalError("\(#function) must be overridden by subclass")}
版本信息
从 3.5 版本开始支持。
参数说明
参数名 | 类型 | 是否必填 | 描述 |
toHostLiveID | String | 必填 | 目标主播的直播间ID。 |
completion | 必填 | 取消请求成功的回调。 |
acceptHostConnection
接受主播连线请求
public func acceptHostConnection(fromHostLiveID: String, completion: CompletionClosure?) {fatalError("\(#function) must be overridden by subclass")}
版本信息
从 3.5 版本开始支持。
参数说明
参数名 | 类型 | 是否必填 | 描述 |
fromHostLiveID | String | 必填 | 发起连线请求的主播直播间ID。 |
completion | 必填 | 接受成功的回调。 |
rejectHostConnection
拒绝主播连线请求
public func rejectHostConnection(fromHostLiveID: String, completion: CompletionClosure?) {fatalError("\(#function) must be overridden by subclass")}
版本信息
从 3.5 版本开始支持。
参数说明
参数名 | 类型 | 是否必填 | 描述 |
fromHostLiveID | String | 必填 | 发起连线请求的主播直播间ID。 |
completion | 必填 | 拒绝成功的回调。 |
exitHostConnection
退出主播连线
public func exitHostConnection(completion: CompletionClosure? = nil) {fatalError("\(#function) must be overridden by subclass")}
版本信息
从 3.5 版本开始支持。
参数说明
参数名 | 类型 | 是否必填 | 描述 |
completion | 必填 | 退出连线成功的回调。 |
getCoHostCandidates
获取可以与当前主播连线的推荐主播列表
public func getCoHostCandidates(cursor: String,completion: CompletionClosure?) {fatalError("\(#function) must be overridden by subclass")}
版本信息
从 3.5 版本开始支持。
参数说明
参数名 | 类型 | 是否必填 | 描述 |
cursor | String | 必填 | 游标。 |
completion | 必填 | 完成回调。 |
数据结构
CoHostStatus
当前用户的跨房连线状态。
枚举值 | 值 | 说明 |
connected | 0 | 和其他主播正在连线中。 |
disconnected | 1 | 没有和其他主播连线。 |
CoHostLayoutTemplate
连线布局模板。
枚举值 | 值 | 说明 |
hostVoiceConnection | 2 | 语聊房连线布局。 |
hostDynamicGrid | 600 | 主播动态网格布局。 |
hostDynamic1v6 | 601 | 主播动态1对6布局。 |
CoHostEvent
连线请求的回调事件。
枚举值 | 说明 |
onCoHostRequestReceived | 当收到连线请求时触发此回调。 |
onCoHostRequestCancelled | 当连线请求被取消时触发此回调。 |
onCoHostRequestAccepted | 当连线请求被接受时触发此回调。 |
onCoHostRequestRejected | 当连线请求被拒绝时触发此回调。 |
onCoHostRequestTimeout | 当连线请求超时时触发此回调。 |
onCoHostUserJoined | 当用户加入连线时触发此回调。 |
onCoHostUserLeft | 当用户离开连线时触发此回调。 |
CoHostState
CoHostStore 对外提供的跨房连线相关状态数据。
属性 | 类型 | 说明 |
coHostStatus | 跨房连线的实时状态。 | |
connected | 正在和当前直播间连线的主播列表。 | |
invitees | 向其他直播间发出请求的主播列表。 | |
applicant | 向当前直播间发起连线请求的主播。 | |
candidatesCursor | String | 推荐用户列表游标。 |
candidates | 推荐用户列表。 |
使用示例
// 创建 store 实例let store = CoHostStore.create(liveID: "live_room_123")// 订阅状态变化store.state.subscribe { state inprint("连线状态: \(state.coHostStatus)")print("已连接主播: \(state.connected.count)")}// 订阅连线事件store.coHostEventPublisher.sink { event inswitch event {case .onCoHostRequestReceived(let inviter, let extensionInfo):print("收到来自 \(inviter.userName) 的连线请求")// 显示接受/拒绝的 UIcase .onCoHostRequestAccepted(let invitee):print("连线请求被 \(invitee.userName) 接受")case .onCoHostUserJoined(let userInfo):print("主播 \(userInfo.userName) 加入连线")default:break}}// 发起连线请求store.requestHostConnection(targetHost: "target_live_id",layoutTemplate: .hostDynamicGrid,timeout: 30,extraInfo: "",completion: { code, message inif code == 0 {print("连线请求发送成功")}})