使用 NativeShare.js 插件做 h5(uniapp)的分享功能

1 篇文章 0 订阅
1 篇文章 0 订阅

一、记录

uniapp官网中对分享有平台差异,APP直接使用uni.share进行分享,配置完各类字段即可;小程序不支持方法调用,只能用户主动点击触发分享;H5则分为普通浏览器和温馨内嵌浏览器,普通浏览器使用自带的分享按钮,而微信内嵌浏览器需要调用js-sdk。点击此处查看官网解释

但是对于目前公司的功能来说,直接使用自带分享功能并不符合需求:① 分享首页;② 分享其中某个页面并携带参数。

第一个需求是正常的分享功能,使用自带分享功能也能解决问题,但是第二个需求并不能简单使用自带分享来实现。

于是找到了一个插件 —— NativeShare.js 来解决这个需求,总的来说还是很好用的,但是此插件针对的是原生的js,里边的demo也是用的纯html页面来显示的,所以我在其基础上改成了使用uniapp来实现。

当然里边的一些兼容性的问题以及原生使用方式,在GitHub上都有解释。(GitHub地址在文章末尾

对于GitHub中插件的文件中只需要srcNativeShare.js即可,剩下的都是一些启动此次项目的配置文件,如果直接引入你自己的项目的话并不用去下载仔细研究。
需要引入的文件

二、使用

1.前期准备(多看几遍官网)

① 微信公众号配置js安全域名

此安全域名只需要配置你页面‘#’前面的域名完全一样即可,‘#’后面的页面以及参数不用配置,那是在页面自行控制的。

示例:
你需要跳转项目中index2页面,你在微信公众号中配置:http://xxx.xx就行了,在页面中需要分享的链接中写index2及参数即可:link: ‘http://xxx.xx/#/pages/index/index2?param=’ + param。

② 服务端生成签名,生成签名时的url必须是动态的,可以使用request来让前台给服务端传当前页面的url,但需要注意的是此url是‘#’前面的域名。
具体常见错误及解决方法见官网的附录5点我查看

2.项目目录

项目目录

3.页面使用

① 新建一个页面,在页面将common下的NativeShare.js引入,再new一个NativeShare即可使用,具体代码:

<template>
	<view>
		<view class="view"  @click="call()">通用分享</view>
		<view class="view" @click="call('wechatFriend')">微信好友</view>
		<view class="view" @click="call('wechatTimeline')">微信朋友圈</view>
		<view  class="view" @click="call('qqFriend')">QQ</view>
		<view class="view"  @click="call('qZone')">QQ空间</view>
		<view class="view"  @click="call('weibo')">微博</view>
		<view class="view"  @click="setTitle('fa-ge NativeShare')">设置标题</view>
		</view>
</template>

<script>
	import '../../common/NativeShare.js'
	export default {
		data() {
			return {
				code: "",
				nativeShare: {},
				shareData: {},
				shareData2: {}
			}
		},
		onLoad(option) {
			let code = option.code
			this.nativeShare = new NativeShare()
			// 特别提示一下微信分享有一个坑,不要分享安全域名以外的链接(具体见jssdk文档),否则会导致你配置的文案无效
			uni.request({
				method: 'GET',
				url: 'http://xxx.xx/getWxToken/',
				header: {
					'Content-Type': 'application/json',
					"Accept":"application/json",
				},
				success: (res) => {
					this.nativeShare.setConfig({
						wechatConfig: {
							appId: 'appId',
							timestamp: res.data.timestamp,
							nonceStr: res.data.nonecestr,
							signature: res.data.sign
						}
					})				
					var nowstamp = Math.floor(new Date().getTime() / (1000 * 60))
					this.shareData = {
						title: '',
						desc: '',
						// 如果是微信该link的域名必须要在微信后台配置的安全域名之内的。
						link: 'http://xxx.xx/#/pages/index/index?code=' + code,
						icon: "/static/img/app-icon.png?t=" + nowstamp,
						// 不要过于依赖以下两个回调,很多浏览器是不支持的
						success: function() {
							uni.showToast({
								title: "设置文案成功",
								icon: 'none'
							})
						},
						fail: function(err) {
							uni.showToast({
								title: "设置文案失败"+err,
								icon: 'none'
							})
						}
					}
					this.shareData2 = {
						title: '',
						// 如果是微信该link的域名必须要在微信后台配置的安全域名之内的。
						link: 'http://xxx.xx/#/pages/index/index?code=' + code,
						icon: "/static/img/app-icon.png?t=" + nowstamp,
						// 不要过于依赖以下两个回调,很多浏览器是不支持的
						success: function() {
							uni.showToast({
								title: "设置文案成功2",
								icon: 'none'
							})
						},
						fail: function(err) {
							uni.showToast({
								title: "设置文案失败2"+err,
								icon: 'none'
							})
						}
					}

				},
				fail: (err) => {
					uni.showToast({
						title: '请求失败',
						icon: 'none'
					})
				}
			})
		},
		methods: {
			call(command) {
				// 根据不同的分享设置不同的文案
				if (command == 'wechatFriend') {
					this.nativeShare.setShareData(this.shareData)
				} else if (command == 'wechatTimeline') {
					this.nativeShare.setShareData(this.shareData2)
				}
				// 判断是否是微信内置浏览器(由于此插件并不能在微信浏览器中打开重新打开微信分享,只能用户收到点击右上角进行分享)
				if (ua.search(/MicroMessenger/i) > -1) {  
					uni.showToast({
						title: '请点击右上角进行分享',
						icon: 'none'
					}) 
				} else {  
					try {
						this.nativeShare.call(command)
					} catch (err) {
						// 浏览器不支持
						uni.showToast({
							title: '当前浏览器暂不支持,请使用其他浏览器打开',
							icon: 'none'
						})
					}
				}
			}
		}
	}
</script>

<style lang="scss">
	.view {
		width: 200rpx;
		height: 200rpx;
		text-align: center;
		margin: 20rpx;
		border: 3rpx solid black;
	}
</style>
4.写在最后的话

此插件有一个不太好的地方就是在微信内嵌浏览器以及qq空间APP中仍然需要用户手动去点击右上角进行分享
但是可以设置不同的文案,即使分享项目中某一个页面的话也能携带不同的参数,能基本解决问题。大家有什么好的方法可以供我参考的一定要告诉我哦…好啦,下次见啦(^o^)/

GitHub地址:https://github.com/yayunD/NativeShare
demo地址:demo

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值