--- name: weapp-share-timeline description: 微信小程序分享到朋友圈开发指南。当开发朋友圈分享功能、配置 onShareTimeline、适配单页模式、处理场景值 1154、navigationBarFit 布局调整时使用。 --- # 微信小程序分享到朋友圈开发指南 基础库 2.11.3+ 支持,Android/iOS 微信 8.0.24+ ## 快速配置 ### 启用分享到朋友圈 页面必须同时满足两个条件才能分享到朋友圈: 1. 先启用"发送给朋友":实现 `onShareAppMessage` 2. 再启用"分享到朋友圈":实现 `onShareTimeline` ### 原生小程序示例 ```javascript Page({ // 1. 必须先启用"发送给朋友" onShareAppMessage() { return { title: '分享标题', path: '/pages/article/index?id=123', imageUrl: '/images/share.png' } }, // 2. 再启用"分享到朋友圈" onShareTimeline() { return { title: '朋友圈分享标题', query: 'id=123', // 注意:不是 path,是 query imageUrl: '/images/timeline-share.png' } } }) ``` ### Taro 示例 ```tsx import Taro, { useShareAppMessage, useShareTimeline } from '@tarojs/taro' function ArticlePage() { // 1. 必须先启用"发送给朋友" useShareAppMessage(() => ({ title: '分享标题', path: '/pages/article/index?id=123', imageUrl: '/images/share.png' })) // 2. 再启用"分享到朋友圈" useShareTimeline(() => ({ title: '朋友圈分享标题', query: 'id=123', imageUrl: '/images/timeline-share.png' })) return 文章内容 } export default ArticlePage ``` ## onShareTimeline 返回参数 | 属性 | 类型 | 说明 | | --- | --- | --- | | title | string | 分享标题,默认为小程序名称 | | query | string | 自定义页面路径中携带的参数,如 `id=123&type=news` | | imageUrl | string | 分享图片 URL,支持本地或网络图片 | **注意**:`onShareTimeline` 使用 `query` 而非 `path`,不支持自定义页面路径。 ## 单页模式 (Single Page Mode) 用户从朋友圈打开分享的小程序页面时,进入"单页模式",这是一个特殊的受限运行环境。 ### 单页模式特点 1. **固定导航栏**:顶部显示页面 JSON 配置的标题,不可自定义 2. **固定操作栏**:底部有"前往小程序"按钮 3. **场景值**:`scene === 1154` 4. **无登录态**:用户未登录,无法获取用户信息 5. **存储隔离**:本地存储与普通模式不共用 ### 检测单页模式 ```tsx // 原生小程序 const scene = wx.getLaunchOptionsSync().scene const isSinglePage = scene === 1154 // Taro import Taro from '@tarojs/taro' const launchOptions = Taro.getLaunchOptionsSync() const isSinglePage = launchOptions.scene === 1154 // 或使用 wx.getApiCategory (基础库 2.22.1+) const apiCategory = wx.getApiCategory() const isBrowseOnly = apiCategory === 'browseOnly' // 朋友圈快照页 ``` ### 页面适配示例 ```tsx import Taro, { useLoad } from '@tarojs/taro' import { View, Text, Button } from '@tarojs/components' import { useState } from 'react' function ArticlePage() { const [isSinglePage, setIsSinglePage] = useState(false) const [article, setArticle] = useState(null) useLoad(() => { const scene = Taro.getLaunchOptionsSync().scene setIsSinglePage(scene === 1154) // 单页模式下使用未登录访问方式获取数据 fetchArticle() }) const fetchArticle = async () => { // 单页模式下无登录态,需使用公开接口 const res = await Taro.request({ url: 'https://api.example.com/public/article', data: { id: articleId } }) setArticle(res.data) } return ( {article?.title} {/* 单页模式下隐藏需要登录的交互 */} {!isSinglePage && ( )} ) } ``` ### navigationBarFit 配置 在页面 JSON 中配置 `navigationBarFit` 来调整顶部导航栏与页面的相交状态: ```json { "navigationBarTitleText": "文章详情", "navigationBarFit": "squeezed" } ``` | 值 | 说明 | | --- | --- | | `float` | 导航栏浮动在页面上方(默认) | | `squeezed` | 页面被导航栏挤压,从导航栏下方开始布局 | ## 单页模式禁用能力 ### 禁用的组件 | 组件 | 说明 | | --- | --- | | `button open-type` | 开放能力按钮 | | `camera` | 相机组件 | | `form` | 表单组件 | | `navigator` | 导航组件 | | `web-view` | 网页容器 | | `live-pusher` | 直播推流 | ### 禁用的 API | 分类 | API | | --- | --- | | **登录** | `wx.login`、`wx.checkSession`、`wx.getUserInfo`、`wx.getUserProfile` | | **路由** | `wx.navigateTo`、`wx.redirectTo`、`wx.reLaunch`、`wx.switchTab`、`wx.navigateBack` | | **媒体** | `wx.chooseImage`、`wx.chooseMedia`、`wx.chooseVideo`、`wx.saveImageToPhotosAlbum` | | **位置** | `wx.openLocation`、`wx.chooseLocation`、`wx.startLocationUpdate` | | **支付** | `wx.requestPayment` | | **分享** | `wx.showShareMenu`、`wx.hideShareMenu`、`wx.updateShareMenu`、`wx.getShareInfo` | | **设备** | 蓝牙、Wi-Fi、NFC、剪贴板、扫码、电话 | | **广告** | `ad` 组件、`wx.createRewardedVideoAd`、`wx.createInterstitialAd` | ### 其他限制 - 不允许横屏使用 - tabBar 不会渲染(包括自定义 tabBar) - 本地存储与普通模式不共用 - 云开发需开启未登录访问 ## 最佳实践 ### 1. 内容型页面优先 分享到朋友圈适用于**纯内容展示**场景: ```tsx // 推荐:文章、新闻、产品详情等内容页 function ArticlePage() { useShareTimeline(() => ({ title: article.title, query: `id=${article.id}`, imageUrl: article.cover })) // ... } // 不推荐:需要大量交互的页面 function ShoppingCartPage() { // 购物车需要登录,不适合分享到朋友圈 } ``` ### 2. 优雅降级 ```tsx function ContentPage() { const [isSinglePage, setIsSinglePage] = useState(false) useLoad(() => { setIsSinglePage(Taro.getLaunchOptionsSync().scene === 1154) }) const handleAction = () => { if (isSinglePage) { // 单页模式下引导用户打开完整小程序 Taro.showToast({ title: '请点击下方"前往小程序"使用完整功能', icon: 'none', duration: 2000 }) return } // 正常模式下执行操作 doSomething() } return ( ) } ``` ### 3. 使用公开 API ```tsx // 单页模式下无登录态,设计公开接口 const fetchData = async (articleId: string) => { // 使用不需要登录的公开接口 const res = await Taro.request({ url: `${API_BASE}/public/articles/${articleId}`, method: 'GET' // 不传 token }) return res.data } ``` ### 4. 安全区域适配 ```tsx function ContentPage() { const [isSinglePage, setIsSinglePage] = useState(false) useLoad(() => { setIsSinglePage(Taro.getLaunchOptionsSync().scene === 1154) }) return ( {/* 页面内容 */} ) } ``` ### 5. 云开发未登录访问 如果使用云开发,需在云函数中开启未登录访问: ```javascript // 云函数 config.json { "permissions": { "openapi": [] }, "overrideUserSecurityRules": { "allow": true // 允许未登录访问 } } ``` ## 运营注意事项 1. **禁止诱导分享**:不得强制用户分享,不得分享立即获得利益 2. **内容完整性**:单页模式应呈现完整内容,不得强制用户点击"打开小程序" 3. **合规使用**:滥用分享能力用于营销、诱导等行为将被平台打击 ## 常见问题 ### Q: 为什么分享到朋友圈按钮没出现? A: 检查以下几点: 1. 是否同时实现了 `onShareAppMessage` 和 `onShareTimeline` 2. 微信版本是否 >= 8.0.24 3. 基础库版本是否 >= 2.11.3 ### Q: 单页模式下如何获取用户数据? A: 单页模式无登录态,需要: 1. 将用户相关信息通过 `query` 参数传递 2. 使用公开接口获取数据 3. 云开发需开启未登录访问 ### Q: 分享图片有什么要求? A: - 支持本地图片或网络图片 - 建议使用正方形图片(1:1 比例) - 图片大小建议不超过 128KB ## 完整文档 详见 [reference.md](reference.md)