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

如何获取当前Sandbox大小或应用程序总大小?

官方方法获取应用总大小与Sandbox占用空间

嘿,这个需求很实用!不管是做存储空间管理功能还是给用户展示App占用情况,官方确实有靠谱的方案可以实现,我分两种核心场景给你梳理清楚:

一、获取应用程序安装包的总大小

如果你要的是App本身的安装包(.app bundle)大小——也就是用户从应用商店下载的包体大小,或者本地bundle的完整占用——可以用以下官方API实现:

  • Swift/Objective-C 通用方案:
    使用FileManager(Swift)或NSFileManager(OC)递归遍历整个应用bundle目录,计算所有文件的大小总和,这也是官方推荐的标准方式,能覆盖bundle里的可执行文件、资源文件、配置文件等所有内容。示例Swift代码:
    func calculateBundleTotalSize() -> UInt64 {
        let bundleURL = Bundle.main.bundleURL
        var totalSize: UInt64 = 0
        let fileManager = FileManager.default
        
        guard let fileEnumerator = fileManager.enumerator(at: bundleURL, 
                                                          includingPropertiesForKeys: [.fileSizeKey], 
                                                          options: [.skipsHiddenFiles]) else {
            return 0
        }
        
        for case let fileURL as URL in fileEnumerator {
            do {
                let resourceAttributes = try fileURL.resourceValues(forKeys: [.fileSizeKey])
                if let fileSize = resourceAttributes.fileSize {
                    totalSize += UInt64(fileSize)
                }
            } catch {
                print("Failed to get file size: \(error.localizedDescription)")
            }
        }
        return totalSize
    }
    
  • macOS 额外补充方案:
    如果你开发的是macOS应用,还可以用NSWorkspace的官方方法单独获取可执行文件的大小,但需要结合其他资源文件的大小计算,才能得到完整的包体大小:
    if let bundleURL = Bundle.main.bundleURL,
       let executableSize = NSWorkspace.shared.forkExecutableSize(for: bundleURL) {
        // executableSize 仅为可执行文件大小,需加上bundle内其他资源的大小
    }
    

二、获取Sandbox的总占用空间

Sandbox包含了App的所有私有数据:Documents、Library(缓存、偏好设置等)、tmp等目录的内容,官方认可的方式是遍历Sandbox根目录,递归计算所有文件的大小总和。示例Swift代码:

func calculateSandboxTotalSize() -> UInt64 {
    // 获取Sandbox根目录(通过Documents目录向上推导)
    guard let sandboxRootURL = FileManager.default.urls(for: .documentDirectory, 
                                                        in: .userDomainMask).first?.deletingLastPathComponent() else {
        return 0
    }
    
    var totalSize: UInt64 = 0
    let fileManager = FileManager.default
    
    guard let fileEnumerator = fileManager.enumerator(at: sandboxRootURL, 
                                                      includingPropertiesForKeys: [.fileSizeKey], 
                                                      options: [.skipsHiddenFiles]) else {
        return 0
    }
    
    for case let fileURL as URL in fileEnumerator {
        do {
            let resourceAttributes = try fileURL.resourceValues(forKeys: [.fileSizeKey])
            if let fileSize = resourceAttributes.fileSize {
                totalSize += UInt64(fileSize)
            }
        } catch {
            print("Failed to get file size: \(error.localizedDescription)")
        }
    }
    return totalSize
}

注意事项

  • 遍历Sandbox目录时无需担心权限问题,App对自身Sandbox内的所有目录都有访问权限;
  • 计算得到的结果是字节数,你可以自行转换为MB/GB等更易读的单位展示给用户;
  • 不要尝试使用私有API(比如某些未公开的系统框架方法)获取系统级的App占用数据,这类方法会导致App审核被拒。

内容的提问来源于stack exchange,提问作者RayChen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:20:32