必须在页面onload中调用uni.hidesharemenu()或uni.hidesharetimeline()隐藏微信小程序分享菜单,h5需用weixinjsbridge.call('hideoptionmenu')并监听weixinjsbridgeready事件,朋友圈单页模式(scene=1154)需在onsharetimeline中return null,安卓复制链接无法完全拦截。
直接禁用分享菜单,用 uni.hidesharemenu() 和 uni.hidesharetimeline() 就行,但必须注意调用时机和平台差异。
页面 onLoad 里调用 uni.hideShareMenu() 才生效
微信小程序中,分享菜单的显示控制是“一次性”的:必须在页面生命周期早期(onLoad 或 onShow 初期)调用隐藏 API,延迟到 onReady 或用户交互后才调就无效。
-
uni.hideShareMenu()隐藏「发送给朋友」和「分享到朋友圈」两个按钮(基础库 ≥ 2.6.0) -
uni.hideShareTimeline()单独隐藏「分享到朋友圈」按钮(兼容更老基础库) - 不能在
onShareAppMessage里 return null 来禁用——那是控制分享内容,不是隐藏菜单 - H5 环境不支持这两个 API,需用
WeixinJSBridge.call('hideOptionMenu')替代(见下一条)
H5 页面禁用右上角分享要等 WeixinJSBridgeReady
微信内置浏览器(公众号/H5)没有统一的 JS API 控制分享开关,必须依赖微信 JS-SDK 的桥接机制,且必须确保 WeixinJSBridge 已就绪。
- 直接写
WeixinJSBridge.call('hideOptionMenu')会报undefined错误 - 必须包裹在
document.addEventListener('WeixinJSBridgeReady', ...)或主动轮询判断typeof WeixinJSBridge !== 'undefined' - 部分安卓微信版本还需额外调用
WeixinJSBridge.call('hideToolbar')才能彻底隐藏底部工具栏 - 这个逻辑建议放在
App.vue的onLaunch+ 全局路由拦截里,避免每个页面重复写
朋友圈单页模式(scene=1154)下禁用分享要重写 onShareTimeline
从微信朋友圈进入的小程序是「单页模式」,此时顶部仍会显示分享按钮,但点击会触发 onShareTimeline。想让它点不动,不能只隐藏菜单,得让这个函数返回 null。
- 必须用
uni.getLaunchOptionsSync().scene === 1154判断来源场景 - 在页面或组件的
onShareTimeline生命周期中,检测到 1154 就直接return null - 注意:这个判断不能放
onLoad里做,因为onShareTimeline是独立触发的;也不能在onShareAppMessage里处理,那是好友分享 - 支付宝等其他平台无 scene=1154 场景,该逻辑需加
#ifdef MP-WEIXIN条件编译
安卓机还有「复制链接」入口,uni.hideShareMenu() 拦不住
微信安卓版在分享菜单被隐藏后,仍可能通过长按页面空白处唤出「复制链接」浮层,该短链仍可跳转小程序——这是系统级行为,无法用 JS 禁用。
-
uni.onCopyUrl只能监听到复制动作,无法阻止,只能事后覆盖剪贴板内容 - 常见做法是
uni.onCopyUrl(() => { setTimeout(() => uni.setClipboardData({ data: '请勿传播' }), 1000) }) - 但用户若在 1 秒内粘贴,仍可能拿到原始链接;真正可控的只有分享菜单和分享卡片行为
- 如果业务强依赖防传播,得配合服务端校验 shareTicket 或限制链接有效期
最易被忽略的是:不同平台、不同入口(扫码/聊天/朋友圈)、不同基础库版本,禁用方式完全不同。写死一个 API 调用,大概率只在某一种路径下生效。











