如何获取当前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
相关产品推荐
相关产品推荐

