uni-app中获取微信小程序scene值的正确方式是在app.vue的onlaunch或onshow回调参数中提取,仅真机或开发者工具有效,h5或模拟器下不可用;scene为数字类型,需用数值比对,如1001代表扫码,0表示无场景。

uni-app 里无法直接用 getLaunchOptionsSync 获取微信小程序场景值,必须通过 onLaunch 或 onShow 的回调参数拿到,且仅在真机或微信开发者工具中有效。
uni-app 中获取 scene 值的正确时机和方式
微信小程序的 scene 值只在冷启动(onLaunch)或前台激活(onShow)时通过参数传入,uni-app 封装后仍沿用该机制。不能在页面 onLoad 里直接调用 API 获取,也不能在 H5 环境下期望返回有效值。
-
onLaunch回调中的options.scene是最可靠的入口场景值(如扫码、群聊分享、公众号跳转等) -
onShow回调中的options.scene可捕获从后台切前台时的场景(例如从聊天窗口点击卡片唤醒) - App.vue 的
onLaunch和onShow是唯一能稳定拿到scene的地方;页面级生命周期里拿不到初始scene - 模拟器或 H5 编译下
scene恒为undefined或1001(默认值),不可用于逻辑判断
常见 scene 值及对应来源(微信官方定义)
uni-app 不做转换,直接透传微信原生 scene 数值。判断时必须用数字比对,而非字符串。
-
1001:扫码(普通二维码) -
1007:公众号菜单进入 -
1008:公众号模板消息 -
1011:长按图片识别二维码 -
1023:群聊分享(带 shareTicket) -
1047:微信搜索结果页进入 -
1089:微信聊天主界面下拉最近使用(非分享)
注意:scene 为 0 表示无场景值(如直接点小程序图标启动),不是错误,需兼容处理。
如何在 onLaunch/onShow 中安全提取并传递 scene
直接解构可能报错(如 options 为空对象),且需区分编译平台。推荐封装一个工具函数统一处理。
export function getScene(options = {}) {
// 微信小程序平台才可能有 scene
if (uni.getSystemInfoSync().platform !== 'ios' && uni.getSystemInfoSync().platform !== 'android') {
return 0;
}
// 兜底取值,避免 undefined 或 null 报错
return Number(options.scene || 0);
}
- 不要在
onLaunch里直接console.log(options.scene)就认为拿到了——得先确认options存在且是对象 - 若需全局使用(如路由守卫中判断来源),建议将
scene存入uni.setStorageSync,但注意它不跨小程序进程,仅限本次启动有效 - 群聊分享(
scene=1023)通常伴随shareTicket,需调用uni.getShareInfo解密,不能仅靠scene判断是否来自群聊
容易被忽略的坑:scene 在分包和自定义组件中不可见
scene 只在 App.vue 的生命周期中出现一次,不会自动透传到子页面、分包页面或自定义组件。如果某个页面需要根据来源做差异化展示,必须在 onLaunch 或 onShow 里提前存好,并在页面中读取。
- 分包页面的
onLoad参数里没有scene,哪怕是从带 scene 的链接进入 - 使用
uni.navigateTo跳转时,scene不会作为url参数自动携带,需手动拼接 - 如果用了
uni.reLaunch或uni.switchTab,原始scene会丢失,除非你主动存到 storage 并在目标页读取
真正麻烦的不是怎么拿,而是怎么让后续所有依赖来源判断的模块都能及时、准确地拿到它——这需要你在 App.vue 里做一次“分发”,而不是每个页面都去猜。











