微信IOS自定义分享签名失败invalid signature

873 阅读2分钟

环境: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
  }
}