vue开发微信活动中遇到的坑

需求背景

前段时间接到PM需求,要做一个微信端的问答+奖励金类活动,大概需求如下:

  1. 首先参与活动需要用户微信授权登录,用户每天默认的答题次数有限,要增加答题机会可分享给好友,好友参与答题了就会给用户增加1-2次机会。
  2. 首页:活动首页展示了用户目前的总奖励金额及剩余的答题次数,可通过首页进入答题页、好友排行榜、游戏规则等。
  3. 排行榜:页面展示参与了答题的好友列表,列出了好友的答题成绩及排行。
  4. 答题页:有若干题目,全部答完后提交答案,跳转至结果页。
  5. 结果页:展示用户当次答题分数及奖励金,有几个按钮,再次答题、分享、去论坛看答案,下载app提现,其中论坛和下载都是外链。
  6. 分享页:一张图片,展示了用户头像和昵称,以及本次答题的分数、奖励金、二维码和一些其他文案,用户通过长按图片将图片分享给好友或朋友圈,好友通过图片中的二维码参与活动。

相关技术

  1. 架构:vue+vue-router+vuex+axios全家桶
  2. 画二维码:qrcode.vue
  3. 画图: html2canvas
  4. 其他工具

需求和技术全部列出来了,一目了然,简单明了
具体的实现细节就不描述了,上面的需求背景中也忽略了一些其他(app内打开,与app的一些交互,微信右上角分享、注册提现等等),不是重点。

下面介绍一下开发过程中踩到的坑:

  1. 使用html2canvas画出的待分享图片(以下统一称分享图),模糊失真。
  2. 分享图不完整,或画图失败、或缺失头像、或整体黑色
  3. 微信ios端长按分享图,只弹出的「保存图像」和「取消」,并没有我们需要的「发送给朋友」和「识别二维码」

解决方案:

  1. html2canvas画的图片失真有两个因素:

    • 高分屏下canvas元素尺寸设置,这个就不多说了,很常见的问题,直接上码
    function html2Image(dom) {
        return new Promise(function(resolve,reject) {
        function getPixelRatio(context) {
          let backingStore = context.backingStorePixelRatio ||
            context.webkitBackingStorePixelRatio ||
            context.mozBackingStorePixelRatio ||
            context.msBackingStorePixelRatio ||
            context.oBackingStorePixelRatio ||
            context.backingStorePixelRatio || 1;
          return (window.devicePixelRatio || 1) / backingStore;
        };
        let shareContent = dom; //需要绘图的DOM对象
        let width = shareContent.offsetWidth; //dom 宽度
        let height = shareContent.offsetHeight; //dom 高度
        let canvas = document.createElement("canvas"); //创建一个canvas节点
        let context = canvas.getContext('2d');
        let scale = getPixelRatio(context);
    
    // 这个地方是处理模糊问题的关键
    canvas.width = width * scale;
    canvas.height = height * scale;
    context.scale(scale,scale);
    
    // 关闭抗锯齿
    context.mozImageSmoothingEnabled = false;
    context.webkitImageSmoothingEnabled = false;
    context.msImageSmoothingEnabled = false;
    context.imageSmoothingEnabled = false;
    
    let opts = {
      scale: scale,// 添加的scale 参数
      canvas: canvas,//自定义 canvas
      logging: false,//日志开关,便于查看html2canvas的内部执行流程
      width: width,//dom 原始宽度
      height: height,backgroundColor: null,// 设置null,透明背景
      useCORS: true // 【重要】开启跨域配置
    };
    // html2canvas
    html2canvas(shareContent,opts).then((canvas) => { 
      // 这里用到了canvas2image组件
      var img = convertToImage(canvas,canvas.width,canvas.height,'image/jpeg');
      resolve(img);
    })

    })
    }

    • 绘制的目标dom中有背景图片
      图片最好作为img元素放进目标dom中,不要作为样式background,不然绘出的图片肯定要模糊
  2. 图片绘制不完整,是由于图片尚未加载完成,或者dom元素没有load结束就开始绘图

    • 解决方法是遍历目标元素中的所有img标签,等待所有图片均加载完后再行绘图
  3. 微信ios下长按菜单没有「发送给朋友」和「识别二维码」

总结

个人微信项目经验不多,仅做记录,也希望对他人能有所帮助。相信这些问题或多或少也有人遇到过,应该也有更有效更优雅的解决方案。如有问题,请多多指教~

相关文章

概述 消息能力是小程序能力中的重要组成,我们为开发者提供了...
判断H5页面环境在微信中还是小程序中 用小程序提供的wx.mini...
wx.reLaunch和wx.navigateTo,wx.navigateTo的区别 2019-03-...
微信小程序如何从数组里取值_微信小程序 传值取值的几种方法...
H5项目接入微信授权登录,通过 UA 区分微信还是普通浏览器:...
微信小程序获取data-xx=""属性的值,自定...