Skip to content

Commit

Permalink
fix: 修复签名组件在微信基础库3.7.8的兼容性问题 (#739)
Browse files Browse the repository at this point in the history
canvasToTempFilePath 接口在微信基础库3.7.8上抛出异常,导致签名组件不可用,改用 base64 + base64ToArrayBuffer 接口实现。

参考:
https://developers.weixin.qq.com/community/develop/doc/0008022ea30318366fe25b3596b800
  • Loading branch information
diamont1001 authored Feb 26, 2025
1 parent 4d1a9d9 commit b43ab7f
Showing 1 changed file with 34 additions and 32 deletions.
66 changes: 34 additions & 32 deletions packages/vantui/src/signature/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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<string> => {
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)
},
})
})
}

Expand Down

0 comments on commit b43ab7f

Please # to comment.