环境:vue、路由模式history;
需求: 分享给好友或者朋友圈,可以自定义分享的标题、描述、链接、图片;所有的页面分享都是相同的标题、描述、链接、图片;
按照官方文档,调取后端接口,传入当前页面的url,安卓分享正常;IOS分享不正常,即自定义无效,开启debug,提示签名失败invalid signature
安卓传入后端接口的当前路径,直接取当前路径就可以; IOS传入后端接口的路径,必须是第一次进入页面的url;
按照这个方式操作后,发现部分IOS机型仍然无法自定义分享(测试iphone XR分享正常,iphone7 不正常)。
接着改造,微信IOS版,对于路由的history模式,切换页面,并不会像安卓一样刷新路由(官方文档并没有类似的提示),但如果换一种方式进入页面,即不用vue-router的push、replace进入页面,使用原生的window.location.href = 'www.youtube.com';
然后发现,IOS的分享就正常了。
从首次进入后,到达第二个路由页面(关键) 比如首次进入的是/page1,要进入的页面是油管;之前前是用router.push()进入的,修改后: window.location.href = www.youtube.com
-------------------------分割线-以下2021.7.27更新---------------------------------
对于微信环境下H5分享,再记录一下;安卓的自定义分享没有出过问题,所以不必讨论。
两种方式解决: 1、如果需要某个页面分享的时候是自定义分享,那么在跳转到这个需要分享的页面时,不采用vue-router的方式,而是用
window.location.href = 'http://www.xxx.com/sharePage'
2、依然采用this.$router.push()来跳转,但获取公众号信息时传递的url,必须是第一次进入路由时hash前面的那一段url,上代码
router.beforeEach((to, from, next) => {
if (from.path === '/' && from.matched && from.matched.length === 0) {
console.log('首次进入')
sessionStorage.setItem('firstEnterUrl', window.location.href)
}
})
获取后端返回的签名、时间戳等信息,把firstEnterUrl截取后传给后端就可以正常返回信息
var params = {
'url': encodeURIComponent(location.href.split('#')[0])
}
if (isIos()) {
let firstEnterUrl = sessionStorage.getItem('firstEnterUrl');
if (firstEnterUrl) {
params.url = encodeURIComponent(firstEnterUrl.split('#')[0])
}
}
export const isIos = function () {
var u = navigator.userAgent
var isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/) // ios终端
if (isiOS) {
return true
} else {
return false
}
}