uni.getFileSystemManager().getAvailableStorage 返回浏览器缓存配额或小程序本地存储限额,与手机真实剩余空间无关;App端需用plus.android调用StatFs获取Android整机存储,iOS无法获取整机剩余空间。

uni-app 里 uni.getFileSystemManager().getAvailableStorage 返回的是什么?
它只在 H5 和小程序环境有效,返回的 availableSize 是浏览器缓存配额或小程序本地存储限额(通常几 MB 到几十 MB),和手机真实剩余空间完全无关。App 端调用该 API 多数情况下直接报错或返回 { availableSize: 0 } —— 这不是 bug,是设计如此。
Android 端必须用 plus.android 调用 StatFs
这是目前唯一稳定、无需额外插件、且能获取整机内部存储剩余空间的方法。关键点在于路径必须是系统数据目录(Environment.getDataDirectory()),不能用 getExternalStorageDirectory()(Android 10+ 权限受限)或临时路径。
-
plus.android.importClass("android.os.Environment")和plus.android.importClass("android.os.StatFs")必须成对导入 -
plus.android.invoke(file, "getPath")是必需步骤,直接传File对象会 crash - 推荐用
getAvailableBlocksLong()和getBlockSizeLong()(而非旧版 int 方法),避免 4GB 以上设备溢出 - 计算后建议除以
1024 * 1024得到 MB,保留一位小数即可,整数易误导(比如 1234567890 字节 ≈ 1177.4 MB)
iOS 端根本拿不到整机剩余空间
这不是 uni-app 的限制,是 iOS 系统级封锁:App 沙盒外的磁盘信息对第三方进程完全不可见。NSFileManager 只能查自己 Documents 或 Caches 目录的可用空间,数值通常只有几百 MB,和“设置 → 通用 → iPhone 存储空间”里看到的 GB 级数字毫无关系。
- 任何声称“纯 JS 获取 iOS 总/剩余存储”的方案,要么伪造数据,要么依赖越狱
-
plus.io.resolveLocalFileSystemURL('_doc/')只能统计你 App 自己的 Documents 目录,不包括照片、微信、系统缓存等 - 如果真需要提示用户“空间不足”,更靠谱的做法是监听
uni.onMemoryWarning+ 检查自身缓存目录大小,而非强求整机值
别混淆“App 占用空间”和“手机剩余空间”
前者要扫 NSCachesDirectory + NSDocumentDirectory(iOS)或 getCacheDir() + getFilesDir()(Android),后者是系统级磁盘总量减去已用——二者技术路径、权限要求、结果含义都不同。写代码前先明确你要解决的实际问题:是清理自家缓存?还是提醒用户卸载应用?目标不同,实现方式完全不同。


















