AtomicXCore SDK 的 LiveListState 和 LiveSeatState 快速构建一个包含主播开播和观众进房功能的语聊房 App。# 1. 安装语聊核心及原生构建工具 (必选)npx expo install react-native-tuikit-atomic-x expo-dev-client expo-build-properties#2. 安装 UI 适配与工具库 (建议)npx expo install react-native-safe-area-context react-native-toast-message react-native-localize
{"expo": {"name": "ExpoLive","slug": "ExpoLive",// ... 其它设置项"ios": {// ... 其它设置项"bundleIdentifier": "com.anonymous.ExpoLive","infoPlist": {"NSMicrophoneUsageDescription": "This app requires access to your microphone for live streaming.","UIBackgroundModes": ["audio"]}},"plugins": ["react-native-localize",["expo-build-properties",{"ios": {"useFrameworks": "static"}}]]}}
AtomicXCore,必须在工程根目录下重新编译一次原生应用,把这些新的 C++/Java/Swift 代码打包进去;仅在首次集成或更新 SDK 版本时需要执行此步,日常开发只需执行步骤 4。# 本地已有 Android 和 iOS 的开发环境,则执行npx expo run:ios //保确已安装 CocoaPodsnpx expo run:android# 或者使用云打包重新生成开发版的安装包npx eas build --profile development --platform all
npx expo start
LoginState 中的 login 方法完成登录,这是使用 AtomicXCore 所有功能的关键前提。import { useLoginState } from 'react-native-tuikit-atomic-x/lib/module/atomic-x/state/LoginState';const { login } = useLoginState();const handleLogin = () => {login({sdkAppID: 1400000001, // 替换为您的 SDKAppIDuserID: "test_001", // 替换为您的 UserIDuserSig: "xxxxxxxxxx" // 替换为您的 UserSig});}
参数 | 类型 | 说明 |
sdkAppID | Int | |
userID | String | 当前用户的唯一 ID,仅包含英文字母、数字、连字符和下划线。 |
userSig | String | 用于腾讯云鉴权的票据。请注意: 开发环境:您可以采用本地 GenerateTestUserSig.genTestSig 函数生成 UserSig 或者通过 UserSig 辅助工具 生成临时的 UserSig。生产环境:为了防止密钥泄露,请务必采用服务端生成 UserSig 的方式。详细信息请参见 服务端生成 UserSig。 |
StateLiveSeatState 实例。您需要监听响应式数据变化,以实时获取麦位数据来渲染您的 UI 界面。import { useLiveSeatState } from 'react-native-tuikit-atomic-x/lib/module/atomic-x/state/LiveSeatState';// 定义语聊房 ID(需要与后续 createLive 中使用的 liveID 保持一致)// liveID 由开发者自定义,建议使用唯一标识符(如 UUID 或时间戳组合)// 格式要求:仅支持英文字母、数字、下划线,长度不超过 64 个字符const liveID = 'your_live_room_id'; // 替换为您的语聊房 ID// 使用 liveID 获取 LiveSeatState 实例const { seatList } = useLiveSeatState(liveID);
DeviceState 的 openLocalMicrophone 接口打开麦克风,示例代码如下:import { useDeviceState } from 'react-native-tuikit-atomic-x/lib/module/atomic-x/state/DeviceState';const { openLocalMicrophone } = useDeviceState();const openMic = () => {openLocalMicrophone();};
LiveListState 的 createLive 接口开始语聊直播,完整示例代码如下:import { useLiveListState } from 'react-native-tuikit-atomic-x/lib/module/atomic-x/state/LiveListState';// 获取 LiveListState 实例const { createLive } = useLiveListState();const startLive = () => {createLive({liveInfo: {liveID: liveID, // 设置语聊的房间 idliveName: 'test', // 设置语聊的房间名称keepOwnerOnSeat: true, // 配置主播始终在麦位上isSeatEnabled: true,seatLayoutTemplateID: 70, // 麦位布局模板(例如 70 为语聊麦位模板)seatMode: 'APPLY', // 上麦模式,例如申请上麦maxSeatCount: 10 // 最大麦位数},onSuccess: () => {console.log('创建语聊房成功');// 此处可进行页面跳转},onError: (error) => {console.log('创建语聊房失败', error);}});};
LiveInfo 参数说明:参数名 | 类型 | 属性 | 描述 |
liveID | string | 必填 | 语聊房的唯一标识符。 |
liveName | string | 选填 | 语聊房的标题。 |
notice | string | 选填 | 语聊房的公告信息。 |
isMessageDisable | boolean | 选填 | 是否禁言( true:是,false:否)。 |
isPublicVisible | boolean | 选填 | 是否公开可见( true:是,false:否)。 |
isSeatEnabled | boolean | 选填 | 是否启用麦位功能( true:是,false:否)。 |
keepOwnerOnSeat | boolean | 选填 | 是否保持房主在麦位上。 |
maxSeatCount | number | 必填 | 最大麦位数量。 |
seatMode | string | 选填 | 上麦模式( FREE:自由上麦,APPLY:申请上麦)。 |
seatLayoutTemplateID | number | 必填 | 麦位布局模板 ID,70 表示语聊。 |
coverURL | string | 选填 | 语聊房的封面图片地址。 |
backgroundURL | string | 选填 | 语聊房的背景图片地址。 |
activityStatus | number | 选填 | 语聊活动状态。 |
isGiftEnabled | boolean | 选填 | 是否启用礼物功能( true:是,false:否)。 |
LiveSeatState 实例,监听 seatList 的变化,以实时获取麦位数据来渲染您的界面。您可以在主播页通过以下方式监听数据:import React, { useEffect } from 'react';import { useLiveSeatState } from 'react-native-tuikit-atomic-x/lib/module/atomic-x/state/LiveSeatState';// 使用 liveID 获取 LiveSeatState 实例const { seatList } = useLiveSeatState(liveID);// 根据 displaySeats 去更新 UIconst displaySeats = React.useMemo(() => {return Array.from({ length: 10 }, (_, i) => {const foundSeat = (seatList || []).find(seat => seat.index === i) || {};return {...foundSeat,displayIndex: i + 1, // UI 显示的序号 (1-10)userId: foundSeat.userInfo?.userID || foundSeat.userId || null,};});}, [seatList]);
LiveListState 的 endLive 接口结束语聊,SDK 会处理停止推流和销毁房间的逻辑。import { useLiveListState } from 'react-native-tuikit-atomic-x/lib/module/atomic-x/state/LiveListState';const { endLive } = useLiveListState();// 结束语聊const handleEndLive = () => {endLive({onSuccess: () => {console.log('结束语聊成功');// 此处可进行页面跳转},onError: (error) => {console.log('结束语聊失败', error);}});}
StateLiveSeatState 实例,并监听 seatList 的变化,以渲染麦位。import { useLiveSeatState } from 'react-native-tuikit-atomic-x/lib/module/atomic-x/state/LiveSeatState';// 定义语聊房 ID(需要与后续 joinLive 中使用的 liveID 保持一致)const liveID = 'your_live_room_id'; // 替换为您的语聊房 ID// 使用 liveID 获取 LiveSeatState 实例const { seatList } = useLiveSeatState(liveID);
LiveListState 的 joinLive 接口加入语聊房,完整示例代码如下:import { useLiveListState } from 'react-native-tuikit-atomic-x/lib/module/atomic-x/state/LiveListState';// 获取 LiveListState 实例const { joinLive } = useLiveListState();// 加入语聊const handleJoinLive = () => {joinLive({liveID: liveID, // 想要加入语聊房的 liveIDonSuccess: () => {console.log('成功进入语聊房');// 此处可进行页面跳转},onError: (error) => {console.log('进入语聊房失败', error);}});};
LiveListState 的 leaveLive 接口来退出。import { useLiveListState } from 'react-native-tuikit-atomic-x/lib/module/atomic-x/state/LiveListState';// 获取 LiveListState 实例const { leaveLive } = useLiveListState();// 退出语聊房const handleLeaveLive = () => {leaveLive({liveID: liveID, // 您当前加入语聊房的 liveIDonSuccess: () => {console.log('退出语聊房成功');// 此处可进行页面跳转},onError: (error) => {console.log('退出语聊房失败', error);}});}

LiveSeatState 提供了 speakingUsers 数据流,专门用于实现此功能。
speakingUsers 变化,并更新“正在说话”状态,代码示例如下:import { useLiveSeatState } from 'react-native-tuikit-atomic-x/lib/module/atomic-x/state/LiveSeatState';// 使用 liveID 获取 LiveSeatState 实例const { speakingUsers } = useLiveSeatState(liveID);useEffect(() => {console.log('正在说话的人', speakingUsers);// 用这个数据和之前监听的 seatList 进行匹配来更新 UI}, [speakingUsers]);
语音聊天室功能 | 功能介绍 | 功能 State | 实现指南 |
实现观众音频连麦 | 观众申请上麦,与主播进行实时音频互动。 | ||
添加弹幕聊天功能 | 观众可以在语音聊天室发送和接收实时文字消息。 | ||
构建礼物赠送系统 | 观众可以向主播赠送虚拟礼物,增加互动和趣味性。 | ||
添加设置音效功能 | 变声(童声 / 男声)、混响(KTV 等)、耳返调节,实时切换特效。 |
State | 功能描述 | API 文档 |
LiveListState | 语音聊天室全生命周期管理:创建 / 加入 / 离开 / 销毁房间,查询房间列表,修改语音聊天室信息(名称、公告等),监听语音聊天室状态(例如被踢出、结束)。 | |
DeviceState | 音视频设备控制:麦克风(开关 / 音量),设备状态实时监听。 | |
CoGuestState | 观众连麦管理:连麦申请 / 邀请 / 同意 / 拒绝,连麦成员权限控制(麦克风),状态同步。 | |
CoHostState | 主播跨房连线:支持多布局模板(动态网格等),发起 / 接受 / 拒绝连线,连麦主播互动管理。 | |
GiftState | 礼物互动:获取礼物列表,发送 / 接收礼物,监听礼物事件(含发送者、礼物详情)。 | |
BarrageState | 弹幕功能:发送文本 / 自定义弹幕,维护弹幕列表,实时监听弹幕状态。 | |
LikeState | 点赞互动:发送点赞,监听点赞事件,同步总点赞数。 | |
LiveAudienceState | 观众管理:获取实时观众列表(ID / 名称 / 头像),统计观众数量,监听观众进出事件。 | |
AudioEffectState | 音频特效:变声(童声 / 男声)、混响(KTV 等)、耳返调节,实时切换特效。 |
App 已获得麦克风的系统使用权限。openLocalMicrophone() 以打开麦克风。endLive 时 App 瞬间闪退(Crash)。expo-modules-core 通过 KVO 监听视频流属性(尺寸、帧率)。流销毁瞬间属性回退为 -1。由于底层代码缺乏边界校验,-1 被作为参数传递给内存分配函数。在 iOS 环境下,-1 隐式转换为无符号整数(UInt64/size_t),数值膨胀为 $2^{64}-1$(即 $18,446,744,073,709,551,615$),诱发系统级 OOM(内存溢出)强杀。文档反馈