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 签名不一致

  • 检查开放平台配置的签名与打包签名是否一致
  • 使用官方提供签名校验工具
相关推荐
子兮曰1 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰1 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万1 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝1 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
A黄俊辉A1 天前
uniapp webview中实现 app和内嵌的H5双向通信
vue.js·json
三十而立洋1 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁1 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
李少兄1 天前
JavaScript 隐式全局变量解析
javascript
honkun61 天前
vue 表格组件 vxe-table 配置 ajax 请求自动加载数据与表单查询
vue.js·vxe-table
kybs19911 天前
全球灾害数据分析可视化 毕业设计-附源码66794
vue.js·spring boot·mysql·安全·django·c#·asp.net