不能直接跨端获取手机剩余存储空间;Android 可通过 StatFs 获取应用数据目录所在分区的可用空间,iOS 则完全无法获取整机存储信息,任何声称支持 iOS 整机存储的方案均不真实或违规。

不能直接跨端获取手机剩余存储空间。Android 可通过 plus.android 读取 /data/data/包名 所在分区的可用空间;iOS 完全无法获取整机存储信息,plus.ios 没有对应能力,任何“纯 JS 获取 iOS 总存储”的方案都不真实。
Android 端用 StatFs 获取内部存储可用空间
这是目前唯一稳定、真机有效的做法,但要注意它返回的是应用数据目录所在分区的剩余空间(不是整个机身存储,比如不包含 /sdcard),对判断“App 是否快写满”已足够。
-
Environment.getDataDirectory()返回的是 JavaFile对象,不能直接传给StatFs构造函数,必须先用plus.android.invoke(file, 'getPath')提取路径字符串 - 务必加平台判断:
#ifdef APP-PLUS && #ifdef ANDROID,iOS 直接跳过或 fallback 提示 - 别用
getBlockSizeLong()或getAvailableBlocksLong()—— HBuilderX 旧版 runtime 不支持 long 方法,只用无后缀版本 - 单位注意:Android Q+ 开始
getBlockSize()返回逻辑块大小(通常 4096 字节),直接乘getAvailableBlocks()即可得字节数 -
getAvailableBlocks()是应用可写空间(受配额限制),getFreeBlocks()是磁盘真正空闲块数,应优先用前者
iOS 端没有整机存储空间 API
系统级限制,不是 uni-app 能绕开的。你看到的“设置 → 通用 → iPhone 存储空间”是系统私有框架渲染的,App 进程无权读取。
- 所谓“iOS 获取存储空间”的插件,实际只是查
NSCachesDirectory或NSDocumentDirectory的可用空间,和整机剩余无关 -
plus.ios没有类似StatFs的类,也没有公开接口暴露磁盘总量或剩余值 - 任何声称支持 iOS 整机存储的方案,要么伪造数据,要么依赖越狱环境,上线会被 App Store 拒绝
uni.getStorageInfoSync 不是你要找的接口
它只返回 localStorage 和 uni.setStorage 数据量,和手机磁盘空间完全无关;在 App 端甚至可能返回空对象或抛错。
- 下载到
temp或cache目录的文件(如uni.downloadFile)不计入该 API 结果 - SQLite 数据库、WebView 缓存、用户导出文件等真实占用,它一概不统计
- 真机上显示的 “12MB” 很可能是开发者工具模拟值,和实际差几倍都正常
真正要监控存储压力,Android 做好 StatFs 路径校验和单位换算,iOS 只能放弃整机指标,转而监控沙盒内缓存目录增长或触发时机(比如上传前检查 NSCachesDirectory 是否低于 50MB)。跨端一致的底线是:别信“统一 API”,平台差异就是硬边界。


















