收藏
回答

前端页面中iOS版微信长按识别二维码的bug?

IOS13.4 iPhoneX

进入微信后调用的replaceState,导致二维码图片无法识别,去掉就好了

回答关注问题邀请回答
收藏

2 个回答

  • Blue。
    Blue。
    2020-06-03
    // 第一版:仅针对demo做的兼容处理,可以解决长按问题。但无法解决项目中;
    var original = window.history.replaceState;
    window.history.replaceState = function() {
        var args = arguments;
        setTimeout(function() {
            original.apply(window.history, args);
        }, 0);
        window.history.replaceState = original;
    };
    
    // 第二版:项目中尝试,延迟需要加到1s后, 但我觉得优先考虑上面的代码;
    let original = window.history.replaceState;
    let timer;
    let startTime = new Date();
    let delay = 1000;
    window.history.replaceState = (...args) => {
        let diff = new Date() - startTime;
        let fn = () => {
            // 确保第一次都是异步的
            setTimeout(() => {
                original.apply(window.history, args);
            }, 0);
            window.history.replaceState = original;
        };
        if (diff < delay) {
            timer && clearTimeout(timer);
            timer = setTimeout(fn, delay - diff);
        } else {
            fn();
        }
    };
    
    /**
     * 最终版
     * 同时解决二维码和签名问题
     */
    let schedule;
    let original = window.history.replaceState;
    window.history.replaceState = (...args) => {
        schedule && schedule('cancel');;
        Promise.race([
            new Promise(r => wx.ready(r)), // 有sdk的情况下
            new Promise((_, reject) => schedule = reject), 
            // 3s这个也可以改成1s,看个人;
            new Promise(r => setTimeout(r, 3000))
        ])
            .then(() => {
                original.apply(window.history, args);
                window.history.replaceState = original;
            }).catch((e) => {
                console.log(e);
            });
    };
    
    2020-06-03
    有用 1
    回复
  • 疯狂的小辣椒
    疯狂的小辣椒
    2020-06-01

    你好,微信版本是多少?麻烦给下复现的链接

    2020-06-01
    有用
    回复 7
    • 101010
      101010
      2020-06-02
      复现地址:http://106.54.133.127/


      微信版本:7.0.12


      手机型号:iPhone11 Pro Max 13.4.1
      2020-06-02
      2
      回复
    • Blue。
      Blue。
      2020-06-02
      replaceState在开发场景中路由守卫很难避免,新项目可以想办法规避,老项目比较难受
      2020-06-02
      1
      回复
    • 101010
      101010
      2020-06-03
      有回信没啊
      2020-06-03
      回复
    • Blue。
      Blue。
      2020-06-03回复101010
      效率低下,自行兼容🤦‍♂️
      2020-06-03
      回复
    • 疯狂的小辣椒
      疯狂的小辣椒
      2020-06-04回复101010
      还在查,有结果再继续同步哈
      2020-06-04
      1
      回复
    查看更多(2)
登录 后发表内容
问题标签