vue-router history模式下的微信分享小结


Posted in Javascript onJuly 05, 2018

背景

旧项目改造,进行前后端分离。做成了spa,为了保证后端路由时期链接可用性,使用了history模式。

因为不同的页面有不同的分享内容,所以每次路由都要重新进行wx.config/wx.ready调用

微信分享遇到的坑

微信官方文档上有下面一段话:

所有需要使用JS-SDK的页面必须先注入配置信息,否则将无法调用(同一个url仅需调用一次,对于变化url的SPA的web app可在每次url变化时进行调用,目前Android微信客户端不支持pushState的H5新特性,所以使用pushState来实现web app的页面会导致签名失败,此问题会在Android6.2中修复)

在实际测试和大量真实数据收集后发现,Android4.4+都是支持pushState的。也就是说,没有遇到官方文档所述的问题。(此番调研后才决定采用history模式进行实施的,导致IOS下踩了坑)

IOS下遇到了问题:

# 打开页面时分享没有问题,路由一次之后再分享签名错误(invalid signature)

这个问题是由于IOS微信浏览器下,有着下面的“特性”:

把第一次打开的页面叫做进入页;把前端路由若干次跳转(通过pushState/replaceState改变url)之后,当前打开的页面叫做当前页。

微信验签使用的url(当前网页的URL,不包含#及其后面部分),在Android下取的是当前页url,在IOS下取的是进入页的url(支付目录也是一样)

知道了这个,可以采取下面的办法来解决:

使用vuex保存进入页的URL,每次wx.config需要的参数,都使用进入页的URL来进行签名

至此,微信分享签名错误的问题解决了,但分享还是不正常:# 自定义分享不生效

度娘谷歌了一番,大概有下面几种办法

  • 使用hash模式
  • 做成多页应用,每个页面都是进入页
  • 所有需要自定义分享的页面使用<a>替换<router-link>,跟2类似,使所有自定义分享页面变成进入页

对于我们的业务场景来说,hash模式不能保证历史链接的可用性,多页/<a>跳转都是以牺牲一定体验性为代价。

经过多番尝试,最后发现用下面的方法勉强解决了问题:

// 进入页面,控制自定义分享前,把当前页URL替换成进入页的URL(保证自定义分享正常)
this.setCurrentPage(location.href)
window.history.replaceState({}, document.title, this.landingPage)
wx.config()
wx.ready()

//...

// 离开当前页时,还原当前页的URL(保证返回正常)
beforeRouteLeave(to, from, next) {
  window.history.replaceState({}, '', this.currentPage)
  next()
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JAVASCRIPT keycode总结
Feb 04 Javascript
jQuery+easyui中的combobox实现下拉框特效
Feb 27 Javascript
JS中prototype的用法实例分析
Mar 19 Javascript
用Node.js通过sitemap.xml批量抓取美女图片
May 28 Javascript
JS实现横向拉伸动感伸缩菜单效果代码
Sep 04 Javascript
JavaScript中this的9种应用场景及三种复合应用场景
Sep 12 Javascript
jQuery实现仿腾讯迷你首页选项卡效果代码
Sep 17 Javascript
jQuery实现自动调用和触发某个事件的方法
Nov 18 Javascript
js控制台输出的方法(详解)
Nov 26 Javascript
BootStrap Table 获取同行不同列元素的方法
Dec 19 Javascript
浅谈webpack组织模块的原理
Mar 10 Javascript
JQuery实现简单的复选框树形结构图示例【附源码下载】
Jul 16 jQuery
微信小程序实现运动步数排行功能(可删除)
Jul 05 #Javascript
微信小程序之批量上传并压缩图片的实例代码
Jul 05 #Javascript
JavaScript控制浏览器全屏显示简单示例
Jul 05 #Javascript
基于jQuery使用Ajax动态执行模糊查询功能
Jul 05 #jQuery
JavaScript递归函数解“汉诺塔”算法代码解析
Jul 05 #Javascript
微信小程序开发之改变data中数组或对象的某一属性值
Jul 05 #Javascript
JavaScript实现京东购物放大镜和选项卡效果的方法分析
Jul 05 #Javascript
You might like
详细介绍:Apache+PHP+MySQL配置攻略
2006/09/05 PHP
加强版phplib的DB类
2008/03/31 PHP
简单的方法让你的后台登录更加安全(php中加session验证)
2012/08/22 PHP
浅析PHP中Collection 类的设计
2013/06/21 PHP
什么是OneThink oneThink后台添加插件步骤
2016/04/13 PHP
php实现36进制与10进制转换功能示例
2017/01/10 PHP
PHP实现根据数组的值进行分组的方法
2017/04/20 PHP
PHP上传文件及图片到七牛的方法
2018/07/25 PHP
JavaScript 组件之旅(一)分析和设计
2009/10/28 Javascript
基于jQuery实现表格数据的动态添加与统计的代码
2011/01/31 Javascript
用javascript模仿ie的自动完成类似自动完成功的表单
2012/12/12 Javascript
项目中常用的JS方法整理
2015/01/30 Javascript
使用Raygun来自动追踪AngularJS中的异常
2015/06/23 Javascript
JavaScript调用客户端Java程序的方法
2015/07/27 Javascript
jQuery UI库中dialog对话框功能使用全解析
2016/04/23 Javascript
JavaScript基础语法之js表达式
2016/06/07 Javascript
AngularJS基础 ng-options 指令详解
2016/08/02 Javascript
jquery  实现轮播图详解及实例代码
2016/10/12 Javascript
Vuejs中使用markdown服务器端渲染的示例
2017/11/22 Javascript
Bootstrap Table中的多选框删除功能
2018/07/15 Javascript
vue中axios请求的封装实例代码
2019/03/23 Javascript
layui实现数据表格隐藏列的示例
2019/10/25 Javascript
vue element el-transfer增加拖拽功能
2021/01/15 Vue.js
python主线程捕获子线程的方法
2018/06/17 Python
浅谈python新式类和旧式类区别
2019/04/26 Python
python批量处理txt文件的实例代码
2020/01/13 Python
CSS超出文本指定宽度用省略号代替和文本不换行
2016/05/05 HTML / CSS
桥梁与隧道工程专业本科生求职信
2013/10/08 职场文书
酒店大堂副理的职责范文
2014/02/13 职场文书
学校安全防火方案
2014/06/07 职场文书
乡镇消防安全责任书
2014/07/23 职场文书
检察机关个人对照检查材料
2014/09/15 职场文书
2015年五一劳动节演讲稿
2015/03/18 职场文书
担保公司2015年终工作总结
2015/10/14 职场文书
为Java项目添加Redis缓存的方法
2021/05/18 Redis
MySQL中的布尔值,怎么存储false或true
2021/06/04 MySQL