其他
学而思一对一企业微信应用实战踩坑之路
背景:企业微信这两年在线下场景呈现爆炸性增长趋势,相比个人微信而言,企业微信有很多个人微信无法比拟的优势,比如品牌标识的加强,外部客户的管理,丰富的运营手段等等,说白了企业微信就是面向企业使用的,个人微信是面向个人使用的,定位的不同也决定了企业微信更加适合在运营、营销、推广方面来使用。经过 2021.3 以来的 2 个大版本的产品迭代,目前学而思一对一企业微信已经在用户画像、标签体系建设、裂变活动、渠道活码、群发助手、多主体支持等方面有了生产环境的实践经验。这篇文章分享一下学而思一对一在开发企业微信应用过程中,遇到的坑,以及如何解决的,希望对其他团队和伙伴有一些帮助。
01
微信h5页面返回授权导致循环跳转
在项目中有这样的需求,在home页需要调用微信非静默授权,授权成功后跳转到活动页,然后渲染活动页的数据。在home页调用获取微信授权的全部地址,类似代码获取链接成功后通过window.location.replace (url) 跳转至授权页,用户允许授权后,微信处理页面跳转至链接中的 REDIRECT_URI 地址,这个地址就是活动页。理想情况下,目前window.his tory中只有一个活动页,当页面返回时,页面栈为空,窗口直接关闭。但事实是当用户返回时,会再次返回到home页中, 而home页继续执行跳转授权逻辑,授权成功跳转到活动页,导致用户无法退出活动页,陷入死循环。引导用户点击页面。在进入页面时弹出弹框,诱导用户点击弹框。这种方法的缺点时如果用户在进入页面后仍不点弹框直接退出,还是会导致页面无法退出,并且并不是所有的页面都适合做弹框。所以该方法并不适合我们的项目。 引入其他第三方库,监听手机原生回退事件,比如引入jQuery mobile,监听手机返回的手势,再执行回调事件。这种方法增加h5页面的大小,不利于页面加载,而且无法保证能监听到所有手机,经测试,在部分手机通过物理按键返回是监听不到的。
02
微信h5前端生成海报
在裂变活动页中,需要请求后台接口获取到活动信息,拿到活动海报数据,包括活动背景图,用户昵称,用户头像,企业微信二维码,将这些图片和文字重新生成海报图,插入页面中,用户可通过长按保存海报或者将海报分享给朋友。项目中通过使用 html2canvas 将 DOM 转换成图片,注意事项⚠️:这里使用的是1.0.0-rc.4版本,部分高版本会导致ios手机生成图片空白的问题确定了实现方案后,接下来就是绘制 DOM,查看html2canvas文档,将DOM转化成图片。2.1 跨域问题通过canvas.toDataURL()转化成图片,会涉及到跨域问题,我们期望图片跟当前域名是同源,但我们需要获取用户的微信头像和企业微信活码,所以首先我们需要解决跨域图片的加载问题。1.html2canvas 配置跨域。通过配置useCORS: true(跨域资源共享):通过cors请求图片时一定会带上值为当前域名的Origin请求头,由于使用html2canvas需要先构造DOM,当DOM中有img标签时,会解析img标签的src属性,然后创建Image对象。请求图片的时候,会从浏览器的缓存中读取图片,缓存中的图片没有Access-Control-Allow-Origin响应头,所以如果不处理img,会导致从图片有缓存时生成图片是空白,所以需要给所有的img标签添加crossOrigin="anonymous"属性,即以跨域的方式重新读取图片数据。所以使用CORS我们需要做的是:配置html2canvas添加useCORS:true 代码 给DOM中img添加crossorigin=“anonym ous” 代码 确保图片CDN服务器支持CORS访问,也就是返回Access-Control-Allow-Origin等响应头
图片已经被访问过,即已经存在于缓存中,需要给图片url后添加随机字符串
使用 img 代替 background-image 的方式,background-image 会导致图片很糊; 配置 scale 属性,获取设备 DPR,以设备支持的devicePixelRatio 生成图片; 代码 获取DOM的宽高,赋值给生成的canvas,由于是在移动端生成海报,如果给生成的图片固定的宽,高度按比例,部分机型会导致生成的canvas有白边
03
容器高度100vh在iPhone上的滚动问题
在测试的过程中我们发现在 iPhone 手机中出现如下情况按照我们的理解,这时的高度应该都是占满屏幕的高度。
另一种适配 iPhone 的方案是代码
当最小高度不支持-webkit-fill-available时,使用min-height: 100vh,同样能保证页面高度撑满整个屏幕
04
记录页面载入时间埋点
在活动页中,我们需要知道用户进入页面到页面呈现的准确时间,来评估用户的体验。主要涉及到window.performance对象。前一个页面的unload(如果有前一个页面) http重定向 检查本地缓存 DNS域名解析 建立TCP连接 客户端发起请求 服务器响应返回资源 解析dom树 页面加载完成
重定向耗时:redirectEnd - redirectStart DNS查询耗时 :domainLookupEnd - domainLookupStart TCP链接耗时 :connectEnd - connectStart HTTP请求耗时 :responseEnd - responseStart 解析dom树耗时 :domComplete - domInteractive 白屏时间 :responseStart - navigationStart DOMready时间 :domContentLoadedEventEnd - navigationStart onload时间:loadEventEnd - navigationStart,也即是onload回调函数执行的时间。
我知道你“在看”哟~