近期熟悉并开发了一个简单的微信小程序,时间花了大概7-8天
期间遇到了一些问题,大部分时间都是在解决这些问题
1. 基础库选择用户占比最高
2. 校验域名,在开发的时候可以不打勾,但是在决定审核之前要打勾进行测试
3. 微信获取用户信息API有变化
https://developers.weixin.qq.com/miniprogram/dev/api/open-api/user-info/wx.getUserProfile.html
我之前使用wx.getUserInfo API,然后因为基础库调整版本高,就一直返回匿名的用户信息,
所以改用了wx.getUserProfile
4. canvas一系列问题
(1) 画图片的圆角时
使用ctx.clip(); 后,要继续画其他内容的话记得 ctx.restore();
drawPromiseImage(ctx, canvas, data) { return new Promise(async (resolve, reject) => { let image = canvas.createImage(); image.src = await this.wxDownloadFile(data.url); if (data.round != 0) { ctx.save(); this.roundRect(ctx, data, true); // 使用了裁剪 } image.onload = () => { ctx.drawImage(image, data.x, data.y, data.width, data.height); if (data.round != 0) { ctx.restore(); // 恢复 } resolve() } image.onerror = e => { reject(e) } }) }, wxDownloadFile(url) { return new Promise((resolve, reject) => { wx.downloadFile({ url, success: (res) => { if (res.statusCode == 200) { resolve(res.tempFilePath); } else { reject() } }, fail: () => { reject() } }) }); }, roundRect(ctx, data, isClip) { let { x, y, width, height, round } = data; x = x * 1; y = y * 1; width = width * 1; height = height * 1; round = round * 1; if (width < 2 * round) round = width / 2; if (height < 2 * round) round = height / 2; ctx.beginPath(); ctx.moveTo(x + round, y); ctx.arcTo(x + width, y, x + width, y + height, round); ctx.arcTo(x + width, y + height, x, y + height, round); ctx.arcTo(x, y + height, x, y, round); ctx.arcTo(x, y, x + width, y, round); isClip&&ctx.clip(); },
(2) 下载图片
https://developers.weixin.qq.com/miniprogram/dev/api/media/image/wx.saveImageToPhotosAlbum.html
因为下载图片不支持网络路径,所以需要小程序的API得到路径
https://developers.weixin.qq.com/miniprogram/dev/api/canvas/wx.canvasToTempFilePath.html
可以wx.canvasToTempFilePath,得到的临时路径来下载,如果满足要求就可以直接用这个,我这边测试iPhone 8 Plus,得到的临时路径的图片是模糊的,所以我改用下面的方法
通过canvas生成的base64,转换成本地连接
https://developers.weixin.qq.com/miniprogram/dev/api/file/FileSystemManager.writeFile.html
base64ToTempFilePath() { return new Promise((resolve, reject) => { const fs = wx.getFileSystemManager(); let imageName = new Date().getTime(); fs.writeFile({ filePath: `${wx.env.USER_DATA_PATH}/${imageName}.png`, data: this.data.canvasImage.slice(22), encoding: 'base64', success(res) { resolve(`${wx.env.USER_DATA_PATH}/${imageName}.png`) }, fail(res) { console.error(res) } }) }) }, async downloadImage(e) { let filePath = await this.base64ToTempFilePath(); wx.saveImageToPhotosAlbum({ filePath: filePath, success: () => { wx.showToast({ title: '已保存到相册' }) }, fail: res => { console.log(res) } }) },