onShareTimeline必须页面级定义且三重开关全开:manifest.json勾选分享模块并填appid、pages.json配置"enableShareTimeline":true、微信公众平台后台开启“分享到朋友圈”开关;同时必须共存onShareAppMessage;朋友圈卡片为单页模式,API受限,图片需HTTPS直链且≥800×800px,query传参须编码,title≤48字符。

onShareTimeline 必须页面级定义且三重开关全开
uni-app 里 onShareTimeline 不会继承全局 mixin,也不支持 App.vue 或 main.js 统一注册——它必须写在每个需要分享的 .vue 页面 script 内部,否则右上角菜单压根不显示“分享到朋友圈”入口。
这背后是微信的三重权限控制,漏掉任意一项都会静默失败(无报错、无提示):
-
manifest.json中“Share(分享)”模块已勾选,且“微信分享”项填了正确appid -
pages.json对应页面配置了"enableShareTimeline": true(不是enableShareAppMessage) - 微信公众平台后台 → 小程序设置 → 功能设置 → “分享到朋友圈”开关已手动开启(2026 年仍需人工操作)
常见现象:按钮灰色不可点、点击后无反应、控制台空空如也——先查这三项,别急着改代码。
朋友圈分享必须和 onShareAppMessage 共存
微信强制要求:一个页面要启用 onShareTimeline,必须同时定义 onShareAppMessage。这不是可选逻辑,而是底层校验规则。即使你只想要朋友圈分享,onShareAppMessage 也得存在,哪怕只返回最简对象。
否则真机运行时,右上角菜单连“分享到朋友圈”都不渲染,开发者工具也可能不报错。
示例写法(放在同个页面 script 中):
onShareAppMessage() {
return { title: '默认标题', path: '/pages/index/index' }
},
onShareTimeline() {
return { title: '朋友圈专用标题', query: 'from=timeline', imageUrl: 'https://xxx.com/share.jpg' }
}
注意:imageUrl 必须是 HTTPS 直链,/static/xxx.jpg 这类本地路径在朋友圈卡片中完全无效。
朋友圈卡片跳转后是单页模式,API 能力受限
用户从朋友圈点击卡片进入小程序,实际运行环境叫“单页模式”,它和普通小程序页面有本质区别:
- 顶部导航栏和底部“前往小程序”栏固定存在,无法用 CSS 隐藏或覆盖
-
wx.login、wx.authorize等需要用户授权的 API 会直接失败,错误为login:fail rejected due to no permission - 无法通过
wx.getEnv()准确识别该环境,更可靠的方式是判断uni.getLaunchOptionsSync().scene === 1154
这意味着:如果你的分享页面依赖登录态或支付流程,必须提前在分享前完成,不能指望用户点开朋友圈卡片后再触发登录——那一步大概率失败。
图片尺寸、路径、参数格式有硬性限制
朋友圈卡片对字段极其敏感,稍有偏差就会降级为纯文字链接(只显示小程序名 + 默认图标):
-
imageUrl必须是 HTTPS 可直访地址,且建议尺寸 ≥ 800×800px;安卓微信 8.0.33+ 会因尺寸不足而 fallback 到默认图 -
path字段在onShareTimeline中不生效,只能用query传参;且query值不能含空格、中文、未编码特殊字符,推荐用encodeURIComponent处理 -
title最多 48 字符,超长会被截断,且不换行;朋友圈卡片不支持desc或摘要字段
验证方法很简单:把 imageUrl 地址粘贴到浏览器地址栏,看能否直接打开并加载正常;把完整分享链接(带 query)复制到微信聊天中发送,再点开,观察是否白屏或 404。
单页模式下没有路由守卫、没有完整的生命周期钩子,所有适配逻辑都得在页面 onLoad 或 onShow 里做判断和兜底,这点容易被忽略。



















