不能直接获取整机剩余存储空间;uni.getStorageInfo仅返回应用沙盒缓存大小,iOS因系统限制无法获取,Android可通过StatFs获取/data/data/包名分区可用空间,但非整机总剩余空间。

不能直接获取整机剩余存储空间。uni-app 官方 API(如 uni.getStorageInfo)只返回应用沙盒内缓存数据大小,和手机真实磁盘空间完全无关;iOS 端因系统限制,根本无法读取总存储/剩余空间;Android 端可通过原生桥接有限获取,但仅限于应用数据目录所在分区,不是“机身总剩余空间”。
Android 端用 StatFs 获取应用数据分区可用空间
这是目前唯一稳定、可上线的方案,返回的是 /data/data/包名 所在分区的剩余字节数,对判断“App 是否快写满”足够有效。
- 必须加平台判断:
#ifdef APP-PLUS && #ifdef ANDROID,iOS 和 H5 直接跳过 -
Environment.getDataDirectory()返回 JavaFile对象,不能直接传给StatFs构造函数,必须先调用plus.android.invoke(file, 'getPath')提取路径字符串 - 避免用
getBlockSizeLong()或getAvailableBlocksLong()—— HBuilderX 旧版 runtime 不支持 long 方法,只用无后缀版本 - 计算单位注意:
getBlockSize()在 Android Q+ 是逻辑块大小(通常 4096),乘getAvailableBlocks()即得字节数 - 优先用
getAvailableBlocks()而非getFreeBlocks():前者受配额限制,反映 App 实际可写空间;后者是磁盘物理空闲块数,不具业务意义
iOS 端没有可靠方案
系统级禁止第三方 App 访问整机存储信息。“设置 → 通用 → iPhone 存储空间”由私有框架渲染,App 进程无权读取。任何声称纯 JS 获取 iOS 总/剩余存储的方案,要么伪造数据,要么依赖越狱。
- 插件市场所谓“iOS 获取存储空间”的插件,实际只是调用
NSFileManager查NSCachesDirectory或NSDocumentDirectory的可用空间——这仍是沙盒内局部空间,和整机无关 - 不能 fallback 到
plus.ios类似 Android 的方式,iOS 没有对应公开 API - 若需提示用户“存储不足”,建议结合上传失败、下载中断等实际行为触发,而非依赖预判数值
别混淆 uni.getStorageInfoSync 和真实磁盘占用
这个 API 完全不适用于检测手机剩余空间,它只统计 localStorage 和 uni.setStorage 数据量,和 App 实际磁盘占用(图片缓存、数据库、downloadFile 下载文件等)毫无关系。
- 真机上
uni.getStorageInfoSync()可能返回空对象或报错,尤其在非微信小程序环境 - 通过
uni.downloadFile下载到temp或cache目录的文件,完全不计入该 API 返回值 - 想算 App 真实磁盘占用?必须写原生插件:Android 查
getCacheDir().getUsableSpace()+getFilesDir().getUsableSpace();iOS 遍历NSCachesDirectory和NSDocumentDirectory并递归累加
真正麻烦的地方不在代码怎么写,而在于“可用空间”本身没有统一定义:Android 分区隔离、iOS 沙盒封闭、Scoped Storage 限制、缓存清理策略差异……所有数值都是上下文相关的近似值,别把它当系统设置里看到的那个数字用。


















