做微信分享时,在苹果手机分享一直不行,就尝试监听URL变化,发现不行。后来用刷新页面解决了。
watch: {
$route(to, from) {
/**
* r o u t e 是 异 步 改 变 的 , 所 以 , 在 c r e a t e d ( ) 函 数 、 m o u n t e d ( ) 函 数 , 用 t h i s . route是异步改变的,所以,在created()函数、mounted()函数,用this. route是异步改变的,所以,在created()函数、mounted()函数,用this.route.fullPath获取的是
* 上一个页面的链接,不是当前页面的链接。
* KaTeX parse error: Expected 'EOF', got '#' at position 94: …ransitions.html#̲基于路由的动态过渡 */ …route.fullPath)
}
},
解决方法:
import WeChatShareUtils from ‘…/…/util/WeChatShareUtils.js’;
created() {
WeChatShareUtils.addFlag();
this.Request.findShareByType(this.shopId, '11').then((res) => {
if(res.success) {
let shareTitle = res.data.title;
let shareDesc = res.data.description;
let shareLink = process.env.DOMAIN_SERVER + this.$route.fullPath;
let shareImgUrl = res.data.image;
WeChatShareUtils.share(shareTitle, shareDesc, shareLink, shareImgUrl);
} else {
this.$toast(res.msg);
}
});
},
destroyed() {
WeChatShareUtils.deleteFlag();
}
附带WeChatShareUtils工具类:
/**
import axios from ‘axios’;
import Qs from ‘qs’;
export default {
isIOS() {
//判断是否iOS手机
let iOS = !!navigator.userAgent.match(/(i[^;]+;( U;)? CPU.+Mac OS X/);
if(iOS) {
return true;
}
return false;
},
addFlag() {
//iOS手机必须刷新页面,才能分享成功。安卓手机,不用刷新。
if(this.isIOS()) {
let iosReload = sessionStorage.getItem(“iosReload”);
if(!iosReload) {
sessionStorage.setItem(“iosReload”, “1”);
window.location.reload();
}
}
},
deleteFlag() {
//在vue的destroyed()函数调用。如果是刷新页面,不会触发destroyed()函数。
sessionStorage.removeItem(‘iosReload’);
},
/**
/**
* 注意,使用window.location.href分享时,获取的链接不是当前页面的,
* 需要使用“协议 + 域名 + 端口 + this.$route.fullPath”的方式,这样才能分享。
* @type {{url: *}}
*/
let data = {
url: link
};
axios.post(configUrl, Qs.stringify(data), {
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
timeout: 60000
}).then((res) => {
if(res.data.success && res.data.data) {
let data = res.data.data;
wx.config({
//调试模式
debug: false,
appId: data.appId,
timestamp: data.timestamp,
nonceStr: data.nonceStr,
signature: data.signature,
//需要使用的JS接口列表
jsApiList: ['onMenuShareAppMessage', 'onMenuShareTimeline',
'onMenuShareQQ', 'onMenuShareQZone', 'onMenuShareWeibo',
'openLocation', 'getLocation']
});
}
}).catch((res) => {
console.error(res);
});
/**
* 微信第一次分享,在安卓手机完全没问题,但是,在苹果手机,不行,要刷新一下才行。
* 或者分享出去,再点开链接,然后分享,没问题,不用刷新。
* 经过检查:
* 1、分享的链接是没问题的。H5弹窗显示,以及后台的接口显示,链接都是对的。
* 2、签名是正确的。
* 3、link必须和公众号js安全域名一致。 -> 链接没错。
* 4、link带有中文,需要使用encodeURIComponent()。 -> 没有中文。
* 可能的原因:
* 1、分享图标,压缩前与压缩后,经过测试,分享与图标无关。(网上说“ios分享图标不能超过32K”)
* 2、安卓手机的url会随着路由切换变化,iphone手机却不会。经过测试,
* 在苹果手机上,路由已经变化了。
* 解决方法:
* 刷新页面。
*/
//config函数执行通过,会自动执行ready函数
wx.ready(() => {
//分享给朋友(即将废弃)
wx.onMenuShareAppMessage({
title: title, //分享标题
desc: desc, //分享描述(简介)
link: shareUrl? shareUrl: link, //分享链接
imgUrl: imgUrl, //分享图标
type: '', //分享类型,music、video或link,不填默认为link
dataUrl: '', //如果type是music或video,则要提供数据链接,默认为空
success: () => {
//分享成功
},
cancel: () => {
//取消分享
}
});
//分享到朋友圈(即将废弃)
wx.onMenuShareTimeline({
title: title, //分享标题
link: shareUrl? shareUrl: link, //分享链接
imgUrl: imgUrl, //分享图标
success: () => {
//分享成功
},
cancel: () => {
//取消分享
}
});
//分享到QQ(即将废弃)
wx.onMenuShareQQ({
title: title, //分享标题
desc: desc, //分享描述(简介)
link: shareUrl? shareUrl: link, //分享链接
imgUrl: imgUrl, //分享图标
success: () => {
//分享成功
},
cancel: () => {
//取消分享
}
});
//分享到QQ空间
wx.onMenuShareQZone({
title: title, //分享标题
desc: desc, //分享描述(简介)
link: shareUrl? shareUrl: link, //分享链接
imgUrl: imgUrl, //分享图标
success: () => {
//分享成功
},
cancel: () => {
//取消分享
}
});
//分享到腾讯微博
wx.onMenuShareWeibo({
title: title, //分享标题
desc: desc, //分享描述(简介)
link: shareUrl? shareUrl: link, //分享链接
imgUrl: imgUrl, //分享图标
success: () => {
//分享成功
},
cancel: () => {
//取消分享
}
});
//config信息验证失败会执行error函数
wx.error((res) => {
console.log('WeChat share error');
console.log(res);
});
});
},
getAddress() {
//获取地理位置,主要是经纬度
//需要在jsApiList添加getLocation
return new Promise((resolve, reject) => {
wx.getLocation({
type: ‘wgs84’,
success: (res) => {
resolve(res);
}
});
});
},
openMap(data) {
//打开地图
//需要在jsApiList添加openLocation
wx.openLocation({
latitude: parseFloat(data.latitude), //纬度,必须是数字,不是字符串
longitude: parseFloat(data.longitude), //经度,必须是数字,不是字符串
name: data.name? data.name: ‘’, //位置名(地点)
address: data.address? data.address: ‘’, //地址详情说明
scale: data.scale? data.scale: 16, //地图缩放级别,整形值,范围从1~28。默认为28
infoUrl: data.infoUrl? data.infoUrl: ‘’ //在查看位置界面底部显示的超链接,可点击跳转
});
}
}