应优先用 uni.setstorage 存关键数据、uni.setstoragesync 存小数据;存对象/数组必须 json.stringify,取时 json.parse;各端存储隔离;注意 10mb 限制及序列化陷阱。

uni.setStorageSync 和 uni.setStorage 到底该用哪个?
同步方法 uni.setStorageSync 会立刻写入并阻塞后续 JS 执行,适合存小数据(比如开关状态、语言偏好);异步方法 uni.setStorage 不阻塞,但必须靠 success 回调确认结果,适合存用户信息、token 等关键数据。
常见错误现象:直接用 uni.setStorageSync('token', obj) 存对象,没报错但取出来是 undefined——因为部分平台对非 JSON-serializable 数据(如 Date、Function、undefined)静默失败或转为空字符串。
- 存对象/数组前务必
JSON.stringify(),取出来后用JSON.parse() - H5 平台虽支持
localStorage.setItem,但小程序和 App 完全不认,跨端项目里必须统一用uni.*Storage*系列 - Android 10+ 对外部存储权限收紧,但
uni.setStorage走的是应用私有沙箱(Android/data/xxx/),无需额外申请权限,这点比自己操作文件安全得多
取不到值?先查这三件事
uni.getStorageSync('key') 返回 undefined 是高频问题,不是 API 坏了,而是环境或逻辑出了岔子。
- 检查 key 是否拼写一致(大小写敏感,且不能含空格或特殊符号)
- 确认数据是同一端写入的:App 端存的,H5 端读不到;微信小程序存的,支付宝小程序也读不到——各端本地存储完全隔离
- 如果是异步写入后立刻同步读,可能还没写完就去读了(尤其在低性能设备上),此时应改用
uni.getStorage+success回调,或加一层 Promise 封装
清缓存时别误伤关键数据
uni.clearStorageSync() 是“核按钮”,一键清空所有 key,上线后千万别留着测试用的自动清缓存逻辑。
真实场景中更常用的是按需清理:
- 登出时只删
token、userInfo、refreshToken这几个 key,用uni.removeStorageSync逐个移除 - 避免在
onLaunch里无条件清缓存,否则用户重启 App 就丢草稿、丢设置 - 如果用了
vuex-persistedstate插件,它默认也走uni.setStorageSync,和你手写的存储共享同一片空间,clearStorageSync会把它一起干掉
10MB 限制不是数字游戏,是实际瓶颈
官方说“约 10MB”,但实测中 iOS 微信小程序常卡在 5–6MB 就开始 fail,Android App 稍宽松些。真正容易超限的不是文本,而是 base64 图片、离线 HTML 片段、大数组日志。
- 存图片优先用
uni.saveFile写入本地文件系统,再存路径,别硬塞进 storage - 用户行为日志类数据建议做滚动覆盖:用
uni.getStorageSync('logList')取出数组,push新项后截取最后 200 条,再setStorageSync - 调试时可用
uni.getStorageInfoSync()查当前已用容量,上线前务必在真机多端验证极限值
最常被忽略的一点:storage 的序列化/反序列化是隐式发生的,你传进去一个 Date 对象,取出来大概率变成字符串;传进去一个 Map,取出来就是 {}。只要涉及复杂结构,JSON.stringify 和 JSON.parse 不是可选项,是必选项。










