uni.clearstoragesync()仅清除storage数据,需配合plus.cache.clear()、uni.clearimagecache()、uni.getsavedfilelist()等手动清理webview、图片及临时文件缓存,并注意h5和小程序端的兼容性差异。

uni.clearStorageSync() 只清 Storage,不是“所有缓存”
调用 uni.clearStorageSync() 后发现头像还是旧的、登录态没完全退出、页面数据没刷新——这不是 API 失效,而是它只清了 uni.setStorage 写入的数据。App 端真正的缓存是分层的:WebView 渲染缓存、网络请求缓存(DNS/HTTP)、图片文件缓存、原生 Cookie、甚至 UTS 插件自己开的 SQLite 文件。只清 Storage 就像擦黑板却忘了扫地。
必须手动清理 plus.cache 和图片缓存(App 专属)
WebView 缓存和图片缓存不会随 uni.clearStorageSync() 消失,必须显式调用原生能力:
-
plus.cache.clear()清空整个 WebView 缓存(含 JS/CSS/图片),iOS 和 Android 行为一致,但需用#ifdef APP-PLUS包裹,否则 H5 或小程序里静默失败 -
uni.clearImageCache()清理 uni-app 下载并缓存的网络图片,同样仅 App 有效;它不清理uni.downloadFile保存的文件,那些得走uni.removeSavedFile - 别漏掉
plus.io.getCacheDir()下的残留临时文件,plus.cache.calculate()可验证是否真清干净
删文件缓存不能只调 uni.removeSavedFile
uni.removeSavedFile({filePath: 'xxx.jpg'}) 只能删单个文件,而用户可能通过 uni.downloadFile、uni.saveFile 或插件保存了几十个临时文件。正确流程是:
- 先用
uni.getSavedFileList()拿到全部已保存文件列表 - 用
Promise.all()分批处理(建议每次 5–10 个),避免 iOS 触发too many open files错误 - 注意:删完后
uni.getImageInfo({src: 'xxx.jpg'})在某些 Android 厂商 ROM 上仍可能读到缓存,属正常现象,非 bug
H5 和小程序端不兼容,必须条件编译隔离
同一套“一键清空”逻辑在不同端行为差异极大:
- H5 端:
uni.clearStorage()实际只清自己写入的 key,localStorage.setItem('ab_test_group', 'B')这类手动写入的数据必须额外调localStorage.clear();若用了 Service Worker,还得caches.delete('api-cache') - 小程序端:清除后
uni.getProvider({service: 'oauth'})返回的 openid 不变,但uni.login()的 code 会失效,登录态需重新走流程 - App 端:清完
uni.getSystemInfoSync().deviceId可能变化(尤其 Android),影响设备唯一标识类逻辑
真正容易被忽略的是:网络请求缓存(如 GET 接口的 Cache-Control: max-age=3600)根本不在前端控制范围内,必须后端响应头加 Cache-Control: no-store 配合,否则前端清得再狠,下次请求照样从 OkHttp 或 WKWebView 磁盘缓存里取旧数据。











