前言
家喻户晓,在应用 vue 做我的项目的时候,微信自定义分享始终是一个坑,只是 ios 上坑显著的多。而后每次遇到问题都要度娘很久。奇怪的是貌似和很多人遇到的问题一样,然而他们写的解决方案都没方法间接解决我遇到的问题。
这里就记录一下遇到过的一些坑,和解决形式。
目前我的项目外面,安卓和 ios 下面的自定义分享曾经没有什么问题了。
问题及解决形式
hash 模式
在微信的官网文档中,提到对于 jsapi_ticket 的签名算法中,生成签名的时候,以后网页的 URL,不蕴含 #及其前面的局部;而且自定义分享进来的链接,微信也会被动往链接的前面拼接一些参数,比方 from 之类的;这也就造成了一些问题,比方要么签名不正确,要么剖析那个进来的链接,二次分享又回出问题。
那么我这里的解决形式就是间接不必 hash 模式了,问题又多,链接也不难看,间接应用mode: ‘history’。
切换页面签名生效
这个在网上也有很多解决方案。因为我这里的我的项目里不须要粗疏到每个页面都必须做自定义分享,只须要在触发某些条件的时候触发自定义分享,所以是这么做的。
在 main.js 文件中编写自定义分享的函数逻辑;
// 微信自定义分享
Vue.prototype.wxShare = async function ({title , desc , link = window.location.href,imgUrl ,success}) {
let that = this;
// 以后页面地址
let url = window.location.href;
// 调用后端服务获取微信签名内容
let {data: wxCfg} = await that.ajax({api: that.api.wechatGetWxSdk, data: {url: url}})
if (!wx || !wxCfg) return;
wx.config({
debug: false,
appId: wxCfg.appId,
timestamp: wxCfg.timestamp,
nonceStr: wxCfg.nonceStr,
signature: wxCfg.signature,
jsApiList: ['updateAppMessageShareData', 'updateTimelineShareData', 'onMenuShareTimeline', 'onMenuShareAppMessage']
});
wx.ready(function () {
wx.updateAppMessageShareData({
title: title, desc: desc, link: link, imgUrl: imgUrl,
success: function () {success ? success() : ''
}
})
wx.updateTimelineShareData({
title: title, link: link, imgUrl: imgUrl,
success: function () {success ? success() : ''
}
})
wx.onMenuShareTimeline({
title: title, link: link, imgUrl: imgUrl,
success: function () {success ? success() : ''
}
})
wx.onMenuShareAppMessage({
title: title, desc: desc, link: link, imgUrl: imgUrl,
success: function () {success ? success() : ''
}
})
})
wx.error(function (res) {that.$toast('请刷新以后页面后重试')
});
}
在须要调用自定义分享的时候,就这样调用
await this.wxShare({
title: '分享的题目',
desc: '分享的摘要',
link: '分享进来的链接地址',
imgUrl: '分享的封面图',
success: function(){// 调用胜利的回调}
})
IOS 路由跳转之后仍然签名生效
下面的问题解决之后,我的项目上线了,很多 ios 的用户反馈个别页面还是无奈胜利调用自定义分享,后期的解决方案很暴力 … 怼用户,让用户刷新一下以后页面,诶不成想,就好了!
起初越来越多的反馈.. 没方法了,必须得想想辙解决一下 …
就开始找起因,发现 android 一点问题没有。然而在 ios 上,无论路由跳转多少次,复制进去的链接都是首次进入的页面的链接,于是革新一下下面的调用函数。
首先记录首次进入页面的 url
Vue.prototype.firstUrl = window.location.href;
复制代码而后在 wxShare 函数中加了一个判断。大抵意思就是判断以后设施是不是 ios,如果是,签名用的 url 就应用 firstUrl,如果不是,就应用 window.location.href
而后上线,发现就没有再出过问题咯。
结束语
本文提供作者:嘟小乾
原贴地址:https://juejin.cn/post/684490…
感觉文章写的好,请给戳↑链接关注作者,给文章点个赞嗷~
更多好文,前端学习材料(Vue、React、Js),请关注公众号【推推猿】,退出 IT 人员社群,取得人脉拓展和大佬们面对面交换~ 更有大厂面试教训、内推岗位的一手材料同步获取~