UniApp 实现分享功能

文章目录

一、环境准备

1. 必要的权限配置

在 manifest 中添加以下权限:

bash 复制代码
{
  "app-plus": {
    "distribute": {
      "android": {
        "permissions": [
          "<uses-permission android:name=\"android.permission.INTERNET\"/>",
          "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
          "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
          "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
          "<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>"
        ]
      }
    }
  }
}

2.各平台配置
微信配置

bash 复制代码
"app-plus": {
  "distribute": {
    "sdkConfigs": {
      "share": {
        "weixin": {
          "appid": "你的微信APPID",
          "UniversalLinks": "https://你的域名/app/"
        }
      }
    }
  }
}

QQ配置

bash 复制代码
"qq": {
  "appid": "你的QQ APPID"
}

二、代码实现

bash 复制代码
<template>
  <view>
    <button @click="share('weixin','WXSceneSession)">微信好友</button>
    <button @click="share('qq','')">QQ好友</button>
    <button @click="share('weixin','WXSceneTimeline')">朋友圈</button>
  </view>
</template>

<script>
export default {
  methods: {
    async share(provider, scene) {
      if (!await this.checkInstall(provider)) return;
      
      try {
        await uni.share({
          provider,
          type: 0, // 0-图文,1-纯文字,2-图片,5-小程序
          title: "优质内容分享",
          summary: "点击查看详情内容",
          href: "https://example.com",
          imageUrl: "/static/share.jpg",
          scene,
        });
      } catch (e) {
        this.handleError(e);
      }
    },
    
    async checkInstall(provider) {
      const installed = await checkAppInstalled(provider);
      if (!installed) {
        uni.showModal({
          title: '提示',
          content: `请先安装${provider === 'weixin' ? '微信' : 'QQ'}`,
          showCancel: false
        });
        return false;
      }
      return true;
    },

	checkAppInstalled(provider) {
      return new Promise((resolve) => {
      	uni.getProvider({
      		service: 'share',
      		success: (res) => {
        		resolve(res.provider.includes(provider));
      		}
    	});
  	  });
    },
    
    handleError(error) {
      console.error('分享失败:', error);
      const msg = {
        '-1': '分享已取消',
        '2': '未安装应用',
        '3': '参数错误'
      }[error.errCode] || '分享失败';
      
      uni.showToast({
        title: msg,
        icon: 'none'
      });
    }
  }
}
</script>

三、常见问题解决

1.iOS 分享图片不显示

  • 确保图片小于32KB
  • 使用网络图片地址(本地路径需转base64)

2. Android 签名不一致

  • 检查开放平台配置的签名与打包签名是否一致
  • 使用官方提供签名校验工具
相关推荐
tryCbest37 分钟前
Vue3——第 13 篇:计算属性与侦听器——computed 与 watch 的进化
前端·javascript·vue.js
怒放的生命19911 小时前
本地用 pnpm 省磁盘,团队继续用 npm:极简实践
前端·npm·node.js
用户117953654781 小时前
企业团队编程软件怎么选:AI编程工具的协作与落地能力对比
javascript
闲来没事抠鼻屎1 小时前
标签打印 8 个尺寸公式:小票、价签、吊牌、面单通用
vue.js
believed_breadfruit1 小时前
我开源了一个HTML 分页导出工具,解决了复杂页面的内容截断、跨页错乱和长文档白屏问题
前端·javascript·github
福狼1 小时前
从“网墙”到柔性曲面:一次 WebGPU 波浪的逆向分析与重建
前端·逆向
宝哥聊编程1 小时前
主流 Agent 平台对比:Coze、Dify、飞书、扣子、OpenClaw 落地实操手册
前端·人工智能·飞书
时间的情敌2 小时前
Vue3 + Cesium 实战:本地上传 GLB 模型、模型上叠加 GLB、点击控制透明度
前端·vue.js·cesium
拖孩2 小时前
流量主门槛从 500 降到 100,我的小程序上线 18 小时够到了线
前端·后端·微信小程序
深蓝AI2 小时前
编码 Agent 的界面味靠提示词压不住:Impeccable 用无模型规则拦同一套模板
前端·程序员