调用 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。
这个函数不是全局可用的,得先用 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 }) }}
常见原因不是接口写错了,而是环境或配置没对上。
room_id 必须是数字类型,传字符串(比如后端返回的 `"123456"`)会导致静默失败,要用 Number(roomId) 强转manifest.json 的 mp-weixin 下正确声明,或版本号填错(如填了 "1.2.0" 但实际最新是 "1.4.0"),编译时不会报错,但运行时 requirePlugin 返回 undefined
endTime 已过)、被平台下架、或未通过审核,此时即使 room_id 正确,也会返回 107 或 104
uni-app 的页面跳转是独立实例,getLiveStatus 不会自动广播变化,得自己搭轻量同步机制。
uni.$emit + uni.$on 在关键节点广播状态变更pages/live/index.vue)里,每 60s 轮询一次,并在状态变化时 uni.$emit('live-status-change', { roomId, status })
uni.$on('live-status-change', ...) 监听,配合 onUnload 里 uni.$off 避免内存泄漏custom_params 里带的参数(如 pid)可用于关联商品,但注意长度上限 600 字符,超长会被截断,别塞大对象最易忽略的一点:状态轮询不能只在直播间页做——用户可能从首页点击订阅组件进入,但首页本身没轮询逻辑,导致“已开播”却还显示“未开始”。得把轮询和广播逻辑抽成公共方法,在多个入口页主动调用。