uni.getLaunchOptionsSync()仅冷启动有效,热启动返回空对象;scene值需结合onShow的options.query和referrerInfo判断,且须平台隔离。

uni.getLaunchOptionsSync() 返回空对象?
微信小程序里 uni.getLaunchOptionsSync() 在某些场景下确实会返回空对象,不是 bug,是机制问题。它只在「冷启动」时有效——也就是用户从桌面图标、聊天记录、公众号菜单等外部入口首次打开小程序时才携带完整参数;如果小程序已经在后台运行,用户通过下拉最近使用列表唤起,就属于热启动,此时这个 API 返回的就是空对象。
实操建议:
- 不要单独依赖
uni.getLaunchOptionsSync()做来源判断,尤其不能用它判断分享卡片来源 - 冷启动时优先取它的
scene字段;热启动时得靠onShow生命周期里的options参数补全 - App.vue 的
onLaunch钩子里调用它最稳妥,onShow里再做二次校验
scene 值怎么查?常见值有哪些
微信官方文档列了 70+ 个 scene 值,但实际项目中高频遇到的就十几个。关键是别硬背,要结合调试日志看真实值。比如用户从微信群点击链接进入,你拿到的 scene 很可能是 1047(群聊),而不是文档里写的“可能为 1044 或 1047”这种模糊描述。
实操建议:
- 在
onLaunch和onShow里都打印console.log(options),真机调试时多试几种入口(扫码、搜索、群聊、公众号菜单) - 重点记这几个:
1001(扫码)、1007(公众号菜单)、1008(朋友圈广告)、1037(微信首页下拉)、1047(群聊) - 注意:
scene是数字类型,不是字符串,比较时别写成options.scene === '1047'
分享卡片里带参数,但 onShareAppMessage 没触发?
这是最容易踩的坑:你以为用户点分享按钮就会触发 onShareAppMessage,然后你往 path 里拼参数——但其实,如果用户没主动分享,而是直接从聊天记录点进来的,这个函数根本不会执行。路径里的参数是上一次分享时写死的,和当前进入场景无关。
实操建议:
-
onShareAppMessage只负责「生成分享链接」,不参与「解析进入参数」 - 真正读取分享参数的地方是
onShow的options.query,比如options.query.from_user_id - 如果需要区分「是别人分享给我的」还是「我自己打开的」,得比对
options.referrerInfo.appId是否存在且不为空
uni-app 多端兼容时 scene 判断失效?
scene 是微信小程序专属字段,H5、App、支付宝小程序里 options 根本没有这个属性。直接写 if (options.scene === 1047) 在非微信端会报错或逻辑错乱。
实操建议:
- 先用
uni.getSystemInfoSync().platform === 'devtools' || 'ios' || 'android'做平台隔离,或者更稳妥地用uni.getSystemInfoSync().platform === 'mp-weixin' - 微信专有逻辑必须包裹在条件里:
if (uni.getSystemInfoSync().platform === 'mp-weixin') { /* scene 判断 */ } - 别用
process.env.UNI_PLATFORM做运行时判断——它只是编译时变量,无法反映真实运行环境
scene 值不是万能钥匙,它只回答「从哪来」,不回答「为什么来」。同一个 scene=1047,可能是运营发的群公告,也可能是用户自己转发测试,真要区分意图,还得靠 query 参数配合业务逻辑兜底。


















