From fa6f852a743304db0bced95260e40a3847ea3999 Mon Sep 17 00:00:00 2001 From: diamont1001 Date: Mon, 24 Feb 2025 10:35:59 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=AD=BE=E5=90=8D?= =?UTF-8?q?=E7=BB=84=E4=BB=B6=E5=9C=A8=E5=BE=AE=E4=BF=A1=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E5=BA=933.7.8=E7=9A=84=E5=85=BC=E5=AE=B9=E6=80=A7=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit canvasToTempFilePath 接口在微信基础库3.7.8上抛出异常,导致签名组件不可用,改用 base64 + base64ToArrayBuffer 接口实现。 参考: https://developers.weixin.qq.com/community/develop/doc/0008022ea30318366fe25b3596b800 --- packages/vantui/src/signature/index.tsx | 66 +++++++++++++------------ 1 file changed, 34 insertions(+), 32 deletions(-) diff --git a/packages/vantui/src/signature/index.tsx b/packages/vantui/src/signature/index.tsx index df66dd9d..bc92432c 100644 --- a/packages/vantui/src/signature/index.tsx +++ b/packages/vantui/src/signature/index.tsx @@ -82,40 +82,42 @@ const Signature = forwardRef(function Signature( return new Promise((resolve, reject) => { const base64 = ctx.current?.canvas?.toDataURL(`image/${props.type}`, 0.8) - Taro.createSelectorQuery() - .select(`#${canvasId}${compIndex}`) - .fields({ - node: true, - size: true, - }) - .exec((res) => { - if ( - process.env.NODE_ENV === 'development' && - ['alipay', 'tt', 'swan', 'kwai', 'dd'].includes( - process.env.TARO_ENV, - ) - ) { - console.warn( - `@anmjs/vantui: signature组件调用了canvasToTempFilePath, 当前IDE不支持调试,须在真机上调试`, - ) - } - Taro.canvasToTempFilePath({ - canvas: res[0].node, - fileType: props.type, - canvasId: `${canvasId}${compIndex}`, - success: (res) => { - resolve({ - tempFilePath: res.tempFilePath, - base64: base64, - canvas: ctx.current?.canvas, - }) - }, - fail: (err) => { - console.error(`@anmjs/vantui: signature 转换图片失败:`, err) - reject(err) - }, + base64ToFile(base64 as string) + .then((filePath) => { + resolve({ + tempFilePath: filePath, + base64: base64, + canvas: ctx.current?.canvas, }) }) + .catch((err) => { + console.error(`@anmjs/vantui: signature 转换图片失败:`, err) + reject(err) + }) + }) + } + + const base64ToFile = (base64: string) : Promise => { + return new Promise((resolve, reject) => { + const data = base64.replace(/^data:image\/\w+;base64,/, '') + const buffer = Taro.base64ToArrayBuffer(data) + const randomFileName = `${Date.now()}-${Math.random() + .toString(36) + .slice(2)}.png` + const filePath = `${Taro.env.USER_DATA_PATH}/${randomFileName}` + + Taro.getFileSystemManager().writeFile({ + filePath, + data: buffer, + encoding: 'binary', + success: () => { + resolve(filePath) + }, + fail: (err) => { + console.error('@anmjs/vantui: signature failed to save file: ', err); + reject(err) + }, + }) }) }