跳到主要内容

本地存档、迁移与失败降级

级别:首作必学。 本地存档用于改善体验,数据可能被用户、系统或测试操作清理。需要跨设备可靠保留的进度,才进一步引入服务端。

首版保存什么​

翻牌项目保存已解锁关卡、声音设置与存档版本。局内中途状态先不持久化,冷启动从关卡重新开始;切后台时仍保留当前内存局。这个边界应写进项目约定,避免玩家误以为未结算牌局一定可恢复。

{"schemaVersion":1,"highestLevel":2,"sound":true}

examples/memory/save.ts 提供 parseProgress(raw) 与默认值。它拒绝未知版本、缺字段和越界进度。通过类型检查不代表从存储读回的数据安全。

读取与写入是独立结果​

// 微信适配层片段:data 是经过校验的 Progress 对象。
wx.setStorage({
key: 'memory.progress', data,
success: () => { /* 本次保存成功 */ },
fail: error => { /* 保留内存进度,记录失败并提示可能无法保留 */ },
});

初始化时区分“没有存档”“有效存档”“损坏或未知版本”“读取失败”。未知版本尤其不要立即用默认值覆盖;可能是旧客户端正在读取新版本数据。保留原记录,按兼容策略处理或让玩家明确选择重置。

若用 sys.localStorage 保存字符串,读取需要 try/catch 处理访问与 JSON 解析失败,再调用验证函数。不要把浏览器成功读写当成微信存档已验证。

迁移与版本​

迁移是显式的 v1 → v2 转换,完成验证后才提交。重要变更可先保留备份键,成功写入并回读验证后再替换。不要承诺多个本地键拥有数据库事务语义。

配置关卡数量减少时,存档里的最高关卡可能超出范围。定义是映射到最近有效关卡、保留原始记录,还是显示已完成,避免数组越界。

存档与资源缓存分开​

清理可重新下载的纹理,不应删除业务进度。代码包文件、临时文件和用户持久文件也有不同语义。用户文件路径从 wx.env.USER_DATA_PATH 获取,不能硬编码设备上的完整路径。

本地加密或校验和只能增加篡改成本或发现损坏,不能让客户端余额可信。奖励和排行榜的信任边界见后端设计。

练习:手动写入损坏 JSON、未来版本、负数关卡,模拟写入失败,再冷启动。完成标准:不崩溃、不悄悄覆盖未知进度,并能解释当前保留了什么。

参考:微信 setStorage、存储策略、文件系统。