- 本项目是采用uniapp开发的H5应用,本人负责了C端前端部分逻辑开发
- 改项目的起因是客户原来用的小鹅通平台续费到期,且有些东西客户想自定义,还有就是价格方面的因素
- uniapp有些值得肯定的东西,一个是多端覆盖,一个是unicloud目前处于公测免费的阶段,另外HbuilderX确实比较接地气,不过无论编辑器插件的生态还是项目插件的生态都不如vscode和vue,还有很多莫名其妙的bug有待修复
开发中遇到的坑
- 腾讯X5浏览器的确是个垃圾
安卓手机在微信里看H5用的是X5内核,当时有个需求是记录视频播放的进度,用uniapp的字面量传参 和 api控制都不能很好的操控进度,后来只能用H5原生的方法去操作进度,而且安卓还要在ontimeupadte事件触发后才生效
let myPlayer = document.getElementsByClassName('uni-video-video')[0]
if (isiOS) {
myPlayer.currentTime = ti
} else {
myPlayer.ontimeupdate = function () {
if (setTimeFlag == 1) {
myPlayer.currentTime = ti
setTimeFlag = 2
}
}
}
-
微信H5分享也很蛋疼
问题在于H5端的微信不能原生的调起微信分享,必须用过自己弹出个引导让用户去右上角点分享,体验相当差
当后端用easywechat这个库返回给前端权限信息的时候,默认是不需要设置当前url的,但不设置就会出错,必须手动设置:
由于前端的是一个vue单页应用,所以要这样把url传给后端:
-
生成海报
需要的工具 一个是二维码生成工具,一个是html2canvas
生成的顺序必须等 头像、主图、二维码渲染完成之后再给跟id用html2canvas导出png或者jpg等,比较裂开的地方在于其中涉及到远程网络的图片,还必须要转换成本地的url才能成功合成文件,为此封装了一个promise用于转换网络图片到本地图片
// 转换网络图片为本地图片
transformNetImageToLocal(url) {
return new Promise((resolve, reject) => {
let canvas = document.createElement('canvas')
let ctx = canvas.getContext('2d')
let img = new Image()
img.src = url
img.crossOrigin = 'Anonymous' //设置image对象可跨域请求
img.src = url + '?timeStamp=' + new Date().getTime() //解决缓存引起访问失败需要添加时间戳
img.onload = () => {
canvas.height = img.height
canvas.width = img.width
ctx.drawImage(img, 0, 0)
const dataURL = canvas.toDataURL('image/png')
resolve(dataURL)
}
img.onerror = reject
})
}
-
请求时间太长的问题
manifest.json文件下面有个async选项,整个去掉即可,uniapp的坑 -
微信授权登陆一直来回跳转的问题
window.location = 'xx.com'
location.href = 'yy.com'
location.reload()
等等诸如此类的表达式,实际只是一个普通的赋值或者函数执行,并不会中断下面代码的执行,所以跳转后一定要加上return结束后面的脚本运行