添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

最近可被小程序扫码这搞得难受了,安卓和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