SBTI 小程序复盘 — 2026-05-04
本次修复保存分享图权限问题 + 首页体验优化
📋 本次完成
| 事项 | 状态 | 说明 | |------|------|------| | 保存分享图权限修复 | ✅ | 后台配置 + 代码优化 | | 首页人格卡片详情弹窗 | ✅ | 底部弹窗展示简介/优势/稀有度 | | 隐私协议补充 | ✅ | 增加相册权限用途说明 |
🔍 深度复盘:保存分享图失败
问题现象
真机保存分享图时提示"保存失败,无法保存图片,请确保手机存储空间充足后重试",但手机存储空间充足。
排查过程
第一轮:代码层面(方向错了)
- 初步判断为
canvasToTempFilePath真机兼容问题 - 添加了重试逻辑(
_retryExportAndSave)——治标不治本 - 用户明确指出:不要重试,要找最佳方案
第二轮:网上调研(接近了但没到根)
- 搜索发现 Canvas 2D 在 iOS 上确实有
canvasToTempFilePath:fail invalid viewId的已知问题 - 社区最佳方案:
canvas.toDataURL()→ base64 → 文件系统写入,绕开这个 API - 同时发现
app.json需要permission声明 - 加了
requiredPrivateInfos: ["saveImageToPhotosAlbum"]——结果报错,这个字段只支持地理位置接口
第三轮:用户追问(找到真正根因)
- 用户问"是不是要微信弹出权限确认框"
- 再次搜索发现大量开发者报
errno: 1025错误 - 根因:微信后台「用户隐私保护指引」未声明相册写入权限
- 线上版直接 banned API 调用,连权限弹窗都不会出现
- 体验版/开发工具不检查这个,所以本地测没问题
根因总结
不是代码问题,是微信后台配置问题。 三个层面都需要正确配置:
- 微信后台 → 设置 → 功能设置 → 用户隐私保护指引:声明「相册(仅写入)」用途
app.json:permission声明(requiredPrivateInfos不支持相册,别加)- 隐私协议页面:补充相册权限用途说明
- 提交审核时:勾选「采集用户隐私」
正确的修复方案
| 层面 | 修改内容 |
|------|---------|
| 微信后台 | 用户隐私保护指引 → 相册(仅写入)→ 用途:保存分享图到手机相册 |
| app.json | permission.scope.writePhotosAlbum 声明 |
| result.js | _exportCanvas 改用 toDataURL + 文件系统写入 |
| 隐私协议 | 补充相册权限说明 |
💡 教训提炼
1. 线上版和开发版的权限检查完全不同
- 体验版/开发工具权限校验宽松,很多问题只有线上版才会暴露
- 不能只在开发工具里测,体验版真机也要测
- 权限相关问题优先查后台配置,不是代码
2. requiredPrivateInfos 只支持地理位置
- 这个字段的名字很容易让人以为支持所有隐私接口
- 实际只支持:
chooseAddress、chooseLocation、choosePoi、getLocation等 saveImageToPhotosAlbum只需要在permission里声明
3. 微信隐私保护框架的完整链路
后台声明用途 → 隐私协议写明 → 代码声明 permission → 用户首次使用弹窗同意 → 系统权限弹窗
任何一环缺失都会导致 API 被 banned。
4. 先调研再动手
- 第一次直接加重试逻辑,方向就偏了
- 如果一开始就搜
errno 1025,5 分钟就能定位根因 - 遇到线上版特有的问题,先搜错误码
✅ 检查清单(以后每个小程序都用)
保存图片功能上线前必查:
- [ ] 微信后台 → 设置 → 功能设置 → 用户隐私保护指引 → 声明相册(仅写入)用途
- [ ]
app.json的permission中声明scope.writePhotosAlbum - [ ] 隐私协议页面包含相册权限用途说明
- [ ] 代码使用
toDataURL+ 文件系统写入(而非canvasToTempFilePath) - [ ] 体验版真机测试保存功能
- [ ] 提交审核时勾选「采集用户隐私」
复盘人:喵喵 | 关键词:saveImageToPhotosAlbum、errno 1025、隐私保护指引、canvasToTempFilePath