最近可被小程序扫码这搞得难受了,安卓和ios的手机执行代码顺序和扫码返回结果都不一样。刚刚好,我的就是安卓的,安卓按照正常情况走,一点问题都没有,但ios就不行了,各种问题,刚刚跳出这个坑又踩进另一个坑。所以我一定要把它这些坑写出来,避免更多人跟我一样跳下去。
1.首先说简单的,扫码返回的结果,
扫一个带有链接的二维码
,安卓扫,result里面不会返回任何东西,这很ok是需求需要的,但ios就不一样了,直接是返回路径。怎么办呢,只能判断是带有链接的,https:或者是http:的去掉,清空不赋值
2.
扫码之后执行onshow的顺序不同,安卓是先执行了onshow再执行扫码的结果,而ios则是先执行扫码之后的结果再执行onshow里面的请求函数。
第二点我的需求是根据一进入onshow是否有值,有值并且不是扫码的就马上对后台发起一个request请求,如果是扫码的话则不执行onshow里面的函数,直接执行扫码后的函数。是否是扫码进入的onshow肯定是用一个字段去设置的,在请求完成之后将扫码这个字段设置回一开始的样子。
我在data初始化一个变量noscanCode为false并且cabinetId为null,在onshow里面判断noscanCode为false,cabinetId不为空,则执行请求函数。思路如下图
data:{
cabinetId :null,
noscanCode:false
onshow:function(){
if(this.data.cabinetId && false== this.data.noscanCode){
this.getData();//获取数据
getCode(){
wx.scanCode({
success(res) {
let id = res.path.substr(res.path.indexOf("?") + 1, res.path.length - 1) ;//得到id的值
this.setData({noscanCode:true,cabinetId :id});
this.getData();//获取数据,里面需要用到this.data.cabinetId
console.log(res);
getData(id){
// 请求数据回来后肯定要再次将noscanCode为false
this.setData({noscanCode:false})
看代码没有问题,但我上面说了ios先执行扫码后的请求的,所以ios是先给变量noscanCode变为true,并且马上赋值cabinetId,赋值完马上就进入getData()函数,之后noscanCode的值变回了false,此时,cabinetId在扫码已有值,刚刚好onshow的函数条件也满足了,所以就导致了ios请求了两次后台。
那看这段代码,在安卓端有没有问题呢?首先,扫码完成的时候,马上先调用了onshow,因为noscanCode还是false,cabinetId也还是null所以并不执行onshow的请求函数,然后直接进入执行扫码请求函数,所以安卓的只调用了一次函数,没有问题。
所以问题点就是在哪里赋值noscanCode和cabinetId问题,noscanCode不应该在wx.scanCode里面赋值,而是应该在点击时getCode里面先赋值再进行扫码,这样问题就能解决了。
最终运行没有错误的代码如下:
data:{
cabinetId :null,
noscanCode:false
onshow:function(){
if(this.data.cabinetId && false== this.data.noscanCode){
this.getData();//获取数据
getCode(){
this.setData({noscanCode:true})
wx.scanCode({
success(res) {
let id = res.path.substr(res.path.indexOf("?") + 1, res.path.length - 1) ;//得到id的值
this.setData({noscanCode:true,cabinetId :id});
this.getData();//获取数据,里面需要用到this.data.cabinetId
console.log(res);
getData(){
// 请求数据回来后肯定要再次将scanCodeBack为false
this.setData({noscanCode:false})
在点击事件一发生的时候就控制noscanCode为true,所以ios中即使cabinetId赋值了,但是onshow里面的条件也没有满足,所以不会请求两次,安卓中因为cabinetId为空,所以noscanCode是否为true都不执行onshow里面的函数,所以也只是执行了getCode里面的函数。
所以我自己的一念之差,跳进了这个坑,发现了这个坑。也因为我惯性把变量放进扫码里面导致了我这个问题的发生,希望各位不要走我的老路,这坑我硬生生花了一个小时才跳出来。
最后你一定会觉得疑问。为什么要用cabinetId判断,因为业务需要,是必不可少的模块,而且判断的条件是四个,并非是2个,这只是为了方便分析问题而做的简单demo。
经测试,安卓手机获取不到参数,但是苹果手机可以
微信小程序码识别出来的参数是scene=key=value&key=value这种格式的
解决方法:把参数截取一下,然后存起来或者重新拼在路径上带过去
wx.scanCode({
success: (res) => {
console.log(res.path)
var path = res.path; //微信开发者工具 在开发者工具里出现乱码需要decodeURIComponent转义,真机不需要,
当扫码之后返回页面 会调用页面的onshow
当我们的页面是列表页(可分页) 当我们在列表页的onshow 需要做刷新操作的时候并且扫码是对列表页单个数据的查询 扫码之后在回到页面 会导致接口刷新两次 就会导致查询的指定数据和页面onshow 刷新的数据在一起
解决办法:
1、在会对列表影响的操作页面,例如:修改页面
解决办法】:清除微信开发者工具的缓存,重新编译。(新添加的方法在生命周期函数里面调用,都需要清除缓存之后重新编译才能正常调用)原本js里面没有onShow方法,后面加上了onShow, 除了第一次页面加载调用了onShow方法,之后切换页面都没有触发。【解决办法】:wx.reLaunch(url) 清除程序缓存。退出登录后,切回列表页面,发现原来的数据没有重置改变。微信小程序tabar页面不触发onShow。......
wx.scanQRCode({
needResult: 0, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果,
scanType: ["qrCode","barCode"], // 可以指定扫二维码还是一维码,默认二者都有
success: function (res) {
var result = res.resultStr; // 当needResult 为 1 时,扫码返回的结果...
在做H5页面的时候,遇到一个很奇怪的问题,测试告诉在他的ipad上购买成功后返回页面不刷新。我:???
测试了多个设备,发现在ios版本的11.4及ios8的ipad上,怀疑是系统版本问题。
项目是基于vue的, 但是不是单页面应用,页面之前之间都是使用location.href跳转的。
charles抓包显示在页面打开的时候根本没有调用接口?
多方百度,都说使用onpageshow方法。...
小程序一般都需要在app.vue的onLaunch做一个异步请求获取用户的openId和token之后才能执行页面的onLoad里的异步请求,像平常用async await控制异步请求的先后顺序,
在小程序里也一样,只不是需要做成全局的。
如 :在main.js里挂载
Vue.prototype.$getToken = new Promise(resolve => {
Vue.prototype.$isResolve = resolve;
然后在app.vue中
onLaunc