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

  • 检查开放平台配置的签名与打包签名是否一致
  • 使用官方提供签名校验工具
相关推荐
一颗小青松几秒前
uniapp设置安卓 ios 自定义启动页
uni-app
仙古.梦回~几秒前
uniapp中使用plus对象实现经典蓝牙
uni-app
softbangong1 分钟前
829-批量提取各子文件夹下文件到一级目录
java·服务器·前端·自动化工具·批量文件处理·文件提取工具·文件夹整理
李剑一2 分钟前
别再瞎写 Cesium 可视化!热力图 + 四色图源码全公开,项目直接复用!
前端·vue.js·cesium
SuperEugene4 分钟前
Vue3 + Vue Router + Pinia 路由守卫规范:beforeEach 应做 / 不应做,避死循环、防重复请求|状态管理与路由规范篇
开发语言·前端·javascript·vue.js·前端框架
Greg_Zhong5 分钟前
Css知识之伪类和伪元素
前端·css
Mintopia6 分钟前
GPT-5.3-Codex 底层逻辑是什么,为什么编码强?
前端·人工智能·ai编程
Mintopia7 分钟前
Opus 模型凭什么收费贵,与其他模型对比理由是什么?
前端·人工智能
东东__net9 分钟前
js逆向与谷歌加密库
开发语言·前端·javascript
程序员小郭8317 分钟前
Spring Ai 05 ChatClient Advisor 实战(日志、提示词增强、内容安全)
java·开发语言·前端