uni-app怎么获取微信小程序直播状态:uni-app直播间信息同步实战

作者:袖梨 2026-07-23
调用 live-player-plugin 的 getLiveStatus 有效需满足:插件已声明引入、仅限微信小程序、组件版本 ≥1.3.0;须用 requirePlugin 动态加载后调用,且在 onLoad 中配合平台判断执行,返回 Promise,状态码为数字(如101直播中),room_id 必须为数字类型,基础库需 ≥2.20.1。

直接调用 live-player-plugin 提供的 getLiveStatus 接口就能拿到直播状态,但必须满足三个前提:插件已正确声明并引入、运行环境是微信小程序、且组件版本 ≥ 1.3.0。其他平台(H5/APP)调用会静默失败或报 requirePlugin is not defined

live-player-plugin 的 getLiveStatus 怎么调用才有效

这个函数不是全局可用的,得先用 requirePlugin 动态加载插件实例,再调用方法。不能写在 mounted 里就直接执行,因为插件加载是异步的,且仅在真机或微信开发者工具中生效。

  • 必须在 onLoad 或后续生命周期中调用,且加 if (uni.getSystemInfoSync().platform === 'ios' || uni.getSystemInfoSync().platform === 'android') 做平台判断(虽然微信环境固定是这两个,但 uni-app 编译时可能跑在非微信平台)
  • getLiveStatus 返回的是 Promise,但首次调用立刻返回结果,后续轮询需手动控制间隔(官方建议 ≥60s),别用 setInterval 频繁刷
  • 返回的状态码是数字:101(直播中)、102(未开始)、103(已结束)、104(禁播)、105(暂停中)、106(异常)、107(已过期),别当成字符串比对
  • 示例代码片段:
onLoad() {  if (uni.getSystemInfoSync().platform !== 'devtools') {    const livePlayer = requirePlugin('live-player-plugin')    livePlayer.getLiveStatus({ room_id: this.roomId }).then(res => {      console.log('直播状态:', res.status) // 注意是 res.status,不是 res.data.status      this.liveStatus = res.status    })  }}

为什么 getLiveStatus 总是返回 102 或 undefined

常见原因不是接口写错了,而是环境或配置没对上。

  • room_id 必须是数字类型,传字符串(比如后端返回的 `"123456"`)会导致静默失败,要用 Number(roomId) 强转
  • 插件未在 manifest.jsonmp-weixin 下正确声明,或版本号填错(如填了 "1.2.0" 但实际最新是 "1.4.0"),编译时不会报错,但运行时 requirePlugin 返回 undefined
  • 页面没在微信小程序基础库 2.20.1+ 上运行(旧基础库不支持该接口),可在微信开发者工具「详情」→「项目设置」里确认基础库版本
  • 直播间本身状态异常:比如已过期(endTime 已过)、被平台下架、或未通过审核,此时即使 room_id 正确,也会返回 107104

如何让直播间信息在页面间同步更新

uni-app 的页面跳转是独立实例,getLiveStatus 不会自动广播变化,得自己搭轻量同步机制。

  • 不要依赖 vuex 或 globalData 存状态,它们无法触发跨页面响应式更新;改用 uni.$emit + uni.$on 在关键节点广播状态变更
  • 在直播间页(pages/live/index.vue)里,每 60s 轮询一次,并在状态变化时 uni.$emit('live-status-change', { roomId, status })
  • 在首页、商品页等需要感知直播状态的地方,uni.$on('live-status-change', ...) 监听,配合 onUnloaduni.$off 避免内存泄漏
  • 如果用户从分享卡片进直播间,custom_params 里带的参数(如 pid)可用于关联商品,但注意长度上限 600 字符,超长会被截断,别塞大对象

最易忽略的一点:状态轮询不能只在直播间页做——用户可能从首页点击订阅组件进入,但首页本身没轮询逻辑,导致“已开播”却还显示“未开始”。得把轮询和广播逻辑抽成公共方法,在多个入口页主动调用。

相关文章

精彩推荐