uniapp多端分享(app,小程序,公众号)

前言

开发uniapp程序的项目,用它生成多端应用,由于兼容各种多端应用,程序代码需要相应的适配,在项目里分享功能是很常见的一个功能,但是在不同的端有不同的方法,我们如何实现多端分享呢?(app,小程序,公众号)

app

app端实现分享功能用到了uniapp内置的api

uni.share() 可以分享到微信、QQ、微博,每个社交平台被称为分享服务提供商,即provider,可以分享文字、图片、图文横条、音乐、视频等多种形式。同时注意,分享为小程序也使用本API。即在App里可以通过本API把一个内容以小程序(通常为内容页)方式直接分享给微信好友

具体Object参数说明参考文档

只能在app端里调用这个api

image.png

给分享按钮绑定一个方法,使用条件编译的方式来判断当前是不是app端

<button class="invite-button" @click="share">
        分享好友
</button>

share(){
// #ifdef APP
    uni.share({
        provider:'weixin',//分享服务提供商(即weixin|qq|sinaweibo)
        type:0,//图文
        scene:'WXSceneSession',//provider 为 weixin 时必选 WXSceneSession分享到聊天界面,WXSceneTimeline分享到朋友圈,WXSceneFavorite分享到微信收藏
        title:'邀请好友领取海量现金券!',//分享内容的标题
        summary:'我正在使用xxxApp,赶紧跟我一起来体验!',//分享内容的摘要
        href:'http://uniapp.dcloud.io/',//跳转链接,type 为 0 时必选
        imageUrl:'https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-uni-app-doc/d8590190-4f28-11eb-b680-7980c8a877b8.png',//图片地址,type 为 0、2、5 时必选
        success(res) {
            //成功返回的参数
            console.log(res);
        },
        fail(err) {
            //失败返回的参数
            console.log(err);
        }
    })
// #endif

03aa754f280415b3d2c24609e02eac7.jpg

小程序

小程序端分享也可以通过uni.share()实现,也可以通过右上角胶囊分享,但还有其他的分享方式

onShareAppMessage(),需要给按钮设置open-type="share",小程序中用户点击分享后,在 js 中定义 onShareAppMessage 处理函数(和 onLoad 等生命周期函数同级),设置该页面的分享信息,此事件需要 return 一个Object,用于自定义分享内容

<button class="invite-button" open-type="share" @click="share">
        分享好友
</button>

onShareAppMessage(){
    return{
        title:'邀请好友领取海量现金券!',
        path:'/pages/my/invite/invite',//页面 path ,必须是以 / 开头的完整路径
        imageUrl:'https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-uni-app-doc/d8590190-4f28-11eb-b680-7980c8a877b8.png',
        desc:'我正在使用xxxApp,赶紧跟我一起来体验!',
    }
},

image.png

公众号

公众号中的分享需要使用微信的JS-SDK,具体文档参考JS-SDK说明文档,需要配置好公众号js域名,可以直接下载js文件引入,也可以通过npm下载npm install weixin-js-sdk --save,公众号的分享比较繁琐,我们可以新建一个js文件封装起来

import wx from "weixin-js-sdk"

/*
 * 微信分享
 * 获取微信加签信息
 * @param{data}:获取的微信加签
 * @param{shareData}:分享配置参数
 */
export const wexinShare = (data, shareData) => {

    let appId = data.appId;
    let timestamp = data.timestamp;
    let nonceStr = data.nonceStr;
    let signature = data.signature;
    wx.config({//通过config接口注入权限验证配置
        debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。(测试记得关掉)
        appId: appId, // 必填,公众号的唯一标识
        timestamp: timestamp, // 必填,生成签名的时间戳
        nonceStr: nonceStr, // 必填,生成签名的随机串
        signature: signature, // 必填,签名,见附录1
        jsApiList: [
                'updateAppMessageShareData',
                'updateTimelineShareData'
            ] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
    });
    wx.checkJsApi({
        jsApiList: ['chooseImage', 'updateAppMessageShareData'], // 需要检测的JS接口列表,所有JS接口列表见附录2,
        success: function(res) {
            // 以键值对的形式返回,可用的api值true,不可用为false
            // 如:{"checkResult":{"chooseImage":true},"errMsg":"checkJsApi:ok"}
            console.log(res, 'checkJsApi')
        }
    });
    wx.ready(function() {//通过ready接口处理成功验证
        // //分享到朋友圈”及“分享到QQ空间”
        wx.updateTimelineShareData({
            title: shareData.title, // 分享标题
            link: shareData.link, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
            imgUrl: shareData.imgUrl, // 分享图标
            success: function(res) {
                console.log("分享朋友圈成功返回的信息:", res);
            }
        })

        //“分享给朋友”及“分享到QQ”
        wx.updateAppMessageShareData({
            title: shareData.title, // 分享标题
            desc: shareData.desc, // 分享描述
            link: shareData.link, // 分享链接 该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
            imgUrl: shareData.imgUrl, // 分享图标
            success: function(res) {
                console.log("分享朋友成功返回的信息:", res);;
            }
        })

    });
    wx.error(function(res) {
        // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
        console.log('验证失败返回的信息:', res);
    });
}

引入刚刚封装暴露出来的方法

import { wexinShare } from '@/common/js/utils.js'

在页面创建的时候.调用后端接口获取签名等数据,把获取到的数据和要分享的数据传入方法

created(){
    this.share()
},

//methods
share(){
    // #ifdef H5
        let currentUrl = location.href //获取当前页面链接
        this.$post('xxxxxx',{
            currentUrl
        }).then((res)=>{
            console.log(res);
            if(res.code==200){
                //获取的微信加签
                let obj={
                    appId: res.appId,
                    nonceStr: res.nonceStr,
                    signature: res.signature,
                    timestamp: res.timestamp,
                    jsApiList: ['updateAppMessageShareData', 'updateTimelineShareData']
                }
                //分享的内容
                let shareData={
                        title:'邀请好友领取海量现金券!',
                        desc:'我正在使用xxxApp,赶紧跟我一起来体验!',
                        link:res.url,
                        imgUrl:'https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-uni-app-doc/d8590190-4f28-11eb-b680-7980c8a877b8.png'
                }
                //调用封装好的方法,传入微信加签和内容
                wexinShare(obj,shareData)
            }else{
                uni.showToast({
                        title: '获取sdk参数失败!',
                        icon:'none'
                    });
                }
        })
    // #endif 
}

注意:如果分享失败,查看wx.error()返回的res参数显示the permission value is offline verifying且错误码为40048,原因是微信公众号js域名没有设置或者分享链接的域名或路径没有与当前页面对应的公众号JS安全域名一致

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值