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 调用,连权限弹窗都不会出现
  • 体验版/开发工具不检查这个,所以本地测没问题

根因总结

不是代码问题,是微信后台配置问题。 三个层面都需要正确配置:

  1. 微信后台 → 设置 → 功能设置 → 用户隐私保护指引:声明「相册(仅写入)」用途
  2. app.jsonpermission 声明(requiredPrivateInfos 不支持相册,别加)
  3. 隐私协议页面:补充相册权限用途说明
  4. 提交审核时:勾选「采集用户隐私」

正确的修复方案

| 层面 | 修改内容 | |------|---------| | 微信后台 | 用户隐私保护指引 → 相册(仅写入)→ 用途:保存分享图到手机相册 | | app.json | permission.scope.writePhotosAlbum 声明 | | result.js | _exportCanvas 改用 toDataURL + 文件系统写入 | | 隐私协议 | 补充相册权限说明 |


💡 教训提炼

1. 线上版和开发版的权限检查完全不同

  • 体验版/开发工具权限校验宽松,很多问题只有线上版才会暴露
  • 不能只在开发工具里测,体验版真机也要测
  • 权限相关问题优先查后台配置,不是代码

2. requiredPrivateInfos 只支持地理位置

  • 这个字段的名字很容易让人以为支持所有隐私接口
  • 实际只支持:chooseAddresschooseLocationchoosePoigetLocation
  • saveImageToPhotosAlbum 只需要在 permission 里声明

3. 微信隐私保护框架的完整链路

后台声明用途 → 隐私协议写明 → 代码声明 permission → 用户首次使用弹窗同意 → 系统权限弹窗

任何一环缺失都会导致 API 被 banned。

4. 先调研再动手

  • 第一次直接加重试逻辑,方向就偏了
  • 如果一开始就搜 errno 1025,5 分钟就能定位根因
  • 遇到线上版特有的问题,先搜错误码

✅ 检查清单(以后每个小程序都用)

保存图片功能上线前必查:

  • [ ] 微信后台 → 设置 → 功能设置 → 用户隐私保护指引 → 声明相册(仅写入)用途
  • [ ] app.jsonpermission 中声明 scope.writePhotosAlbum
  • [ ] 隐私协议页面包含相册权限用途说明
  • [ ] 代码使用 toDataURL + 文件系统写入(而非 canvasToTempFilePath
  • [ ] 体验版真机测试保存功能
  • [ ] 提交审核时勾选「采集用户隐私」

复盘人:喵喵 | 关键词:saveImageToPhotosAlbum、errno 1025、隐私保护指引、canvasToTempFilePath