You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:28:17