NSFileSystem+attributesOfFileSystem获取磁盘空间与iOS设置应用不符
iOS 存储容量与 Settings.app 显示不符的问题解决
我之前也碰到过一模一样的情况!你观察到的现象很典型:总空间和系统显示一致,但可用空间明显偏低,核心原因是你用的API获取的是文件系统层面的剩余空间,而非Settings.app里展示的「用户实际可用空间」。
为什么会有差异?
iOS的存储计算分两种维度:
- 文件系统剩余空间:这是你当前获取的
volumeAvailableCapacityKey对应的值,代表文件系统里未被占用、无需清理就能直接使用的空间。但iOS会预留大量空间给系统缓存、临时文件、OTA更新备用,还有各类应用的可回收缓存(比如Safari离线数据、App缓存),这些都会被算成「已用」,但Settings.app会把它们归类为可释放的空间,计入「可用」。 - 用户可用空间:Settings.app显示的就是这个值,它包含了文件系统剩余空间 + 系统可以自动清理的可回收缓存,也就是你真正能用来装App、照片、视频的空间。
怎么获取和Settings一致的数值?
从iOS 11开始,Apple提供了专门的API来获取这个用户视角的可用空间:volumeAvailableCapacityForImportantUsageKey。用这个API替换原来的volumeAvailableCapacityKey就能得到和Settings.app完全匹配的结果。
给你一份测试过的Swift代码:
import Foundation func fetchStorageInfoMatchedWithSettings() { let fileManager = FileManager.default guard let containerURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first else { print("Failed to get document directory URL") return } do { // 获取总容量和用户可用容量 let storageKeys: [URLResourceKey] = [.volumeTotalCapacityKey, .volumeAvailableCapacityForImportantUsageKey] let resourceValues = try containerURL.resourceValues(forKeys: Set(storageKeys)) // 格式化显示(和系统风格一致) let formatter = ByteCountFormatter() formatter.countStyle = .file if let totalCapacity = resourceValues.volumeTotalCapacity { print("总空间: \(formatter.string(fromByteCount: Int64(totalCapacity)))") } if let availableCapacity = resourceValues.volumeAvailableCapacityForImportantUsageKey { print("可用空间(与Settings一致): \(formatter.string(fromByteCount: Int64(availableCapacity)))") } // 对比旧API的结果 let oldResourceValues = try containerURL.resourceValues(forKeys: [.volumeAvailableCapacityKey]) if let oldAvailable = oldResourceValues.volumeAvailableCapacity { print("文件系统原始剩余空间: \(formatter.string(fromByteCount: Int64(oldAvailable)))") } } catch { print("获取存储信息失败: \(error.localizedDescription)") } } // 调用测试 fetchStorageInfoMatchedWithSettings()
补充说明
- 总空间的数值是正确的:厂商标注的256GB是按1GB=1000³字节计算,而iOS按1GB=1024³字节换算,所以256*1000³≈255GB,和你获取的
255937040384完全匹配,Settings.app里的总空间显示也是这个数值。 - 如果你需要兼容iOS 10及以下,那只能用旧的
NSFileSystemSize和NSFileSystemFreeSize,但这些无法获取用户视角的可用空间,只能拿到文件系统层面的数值。
内容的提问来源于stack exchange,提问作者vsanthanam510
相关产品推荐
相关产品推荐

