uni.clearstoragesync() 仅清除 uni.setstorage 写入的数据,无法清理图片缓存、webview 缓存、下载文件及日志文件;app 端需分别调用 uni.clearimagecache()、plus.cache.clear() 及手动遍历删除日志文件,并控制并发数量以防崩溃。

uni.clearStorageSync() 不能一键清空 App 全部缓存
它只清掉 uni.setStorage 写入的数据,比如 token、用户配置;但图片缓存、WebView 缓存、下载文件、临时日志文件全都不在它的作用范围内。直接调用 uni.clearStorageSync() 后发现“缓存还在”,是正常现象,不是你代码写错了。
App 端真正要清的三类缓存必须分别处理
App(即 APP-PLUS 平台)缓存分属不同机制,不组合清理就等于没清:
-
Storage 数据:用
uni.clearStorageSync()或uni.clearStorage()(注意登出场景建议只删关键 key,如token、userInfo,别无脑全清) -
图片缓存:必须加条件编译
#ifdef APP-PLUS,再调uni.clearImageCache();H5 和小程序里调这个 API 是静默失败,不会报错也不会生效 -
WebView 缓存:需 native 插件,
const cache = uni.requireNativePlugin('plus.cache'),然后cache.clear();iOS 和 Android 行为一致,但不触碰 OkHttp/CFNetwork 的 HTTP 磁盘缓存——那部分得靠服务端响应头Cache-Control: no-store控制
日志文件得自己管,uni 不提供统一日志清理 API
如果你用 uni.getFileSystemManager() 把日志写到 uni.env.USER_DATA_PATH 下,就得手动遍历删:
- 先用
fs.readdir({ dirPath: uni.env.USER_DATA_PATH })列出所有文件 - 对每个文件调
fs.stat()检查是否是日志(比如后缀为.log或文件名含log_) - 再用
fs.unlink({ filePath: ... })删除;注意unlink是回调式 API,不返回 Promise,别混用await - 别忘了加时间判断:只删 7 天前的日志,避免误删正在写的活跃日志文件
如果日志存在 plus.io.getCacheDir() 下(比如某些 SDK 自动写入),uni API 触达不到,得用 plus.io 原生接口配合 plus.io.resolveLocalFileSystemURL 才能访问和删除。
并发删文件容易崩,尤其 iOS 上
uni.removeSavedFile() 和自定义日志 fs.unlink() 都不支持批量传参,必须逐个调用。但一次性发起几十个删除请求,在 iOS 上会触发 too many open files 错误,App 卡死或崩溃。
- 正确做法是分批:每次最多并发 5–10 个,用
Promise.all(fileList.slice(i, i+5).map(...))控制 - 别在
onLaunch或页面onLoad里无脑执行清理逻辑——用户刚打开 App 就卡住,体验极差 - 清理完成建议验证:调
plus.cache.calculate()看 WebView 缓存大小是否归零,或fs.getFileInfo()查关键日志目录剩余大小
最常被忽略的是:H5 端混用的 localStorage.setItem()、PWA 的 caches.delete()、以及 Android 厂商定制的图片缓存路径——这些都不会被上述任何 uni.* 方法触达,跨端项目上线前必须 grep 检查。











