Application Support — 是 iOS 应用沙盒中的一个目录,用于存储应用运行所需的辅助数据,但这些数据并非由用户直接创建。根据 Apple File System Basics (2024),该目录最适合存放配置文件、Core Data SQLite 数据库、缓存文档以及应用自行生成的其他数据。与 Documents Directory 不同,Application Support 不会显示在 iTunes File Sharing 中,用户也无法直接访问它,从而保护服务数据免遭意外删除。
要点
Application Support — 是 iOS 应用沙盒中的一个目录,用于存储应用创建并用于自身运行的数据,但这些数据并非用户文档。这是配置文件、数据库、缓存元数据和其他辅助文件的主要存放位置。
iOS 将 Application Support 视为 Documents(用户数据)和 Caches(临时数据)之间的中间层级。Application Support 中的文件可能相对持久,但用户不应直接访问它们——这使其与 Documents Directory 区分开来。
根据 Apple Developer Documentation (2024),Application Support 是存储 Core Data SQLite 数据库、Realm 文件、JSON/plist 格式配置、下载的参考资料以及应用使用但用户未明确创建的其他数据的推荐位置。
重要提示:默认情况下,Application Support 包含在 iCloud 和 iTunes 备份中。如果应用在此目录中存储了大量可恢复的数据(例如下载的指南),则需要为相应文件设置 isExcludedFromBackup 标志。
在 Swift 中,通过 FileManager.urls(for: .applicationSupportDirectory) 获取 Application Support Directory 的路径。Apple 建议在 Application Support 内创建一个以应用名称命名的子目录以实现数据隔离。
import Foundation
let fileManager = FileManager.default
guard let appSupportURL = fileManager.urls(
for: .applicationSupportDirectory,
in: .userDomainMask
).first else { return }
// 创建应用子目录
let bundleID = Bundle.main.bundleIdentifier ?? "com.example.app"
let appDir = appSupportURL.appendingPathComponent(bundleID)
try fileManager.createDirectory(
at: appDir,
withIntermediateDirectories: true
)
Objective-C 使用 NSSearchPathForDirectoriesInDomains 配合 NSApplicationSupportDirectory。与 Swift 类似,建议创建一个以应用名称命名的子目录。
@import Foundation;
NSArray *paths = NSSearchPathForDirectoriesInDomains(
NSApplicationSupportDirectory,
NSUserDomainMask,
YES
);
NSString *appSupportPath = paths.firstObject;
NSString *appDir = [appSupportPath stringByAppendingPathComponent:@"com.example.app"];
在首次启动时,Application Support 目录可能不存在——需要使用 createDirectory(at:withIntermediateDirectories:) 创建。这使其与系统自动创建的 Documents Directory 区分开来。
Application Support 适用于应用在运行过程中使用的各种数据。为此目录选择正确的数据可以改善文件系统的组织并简化备份。
SQLite 文件 Core Data 默认在 Application Support 中创建。Realm 也建议将数据库放置在此目录中。这可以将用户文档与应用内部数据库隔离开来。
JSON、plist、带有应用设置的 XML 文件、Feature Flags、缓存的用户元数据(但不包括身份验证令牌——这些应使用 Keychain)。
| 数据类型 | Application Support | 替代方案 |
|---|---|---|
| SQLite Core Data | 是(默认) | — |
| 配置 .plist / .json | 是 | UserDefaults(简单配置用) |
| 下载的参考资料 | 是 | Documents(如果面向用户) |
| 应用日志 | 有条件 | Caches(用于日志) |
| 身份验证令牌 | 否 | Keychain |
选择标准:如果数据由应用创建和使用(而非用户),并且需要在启动之间保留——它们的位置在 Application Support 中。
Core Data — Application Support 的主要使用者之一。创建 NSPersistentContainer 时,Core Data 会自动将 SQLite 文件放置在 Library/Application Support 中,并使用基于模型名称的唯一名称。
了解 Core Data 存储文件的位置对于迁移、备份和调试至关重要。主要文件:.sqlite(数据)、.sqlite-wal(预写日志)、.sqlite-shm(共享内存)。
import CoreData
// 创建 Core Data 容器
let container = NSPersistentContainer(name: "MyAppModel")
// 自定义存储目录
guard let appSupportURL = FileManager.default
.urls(for: .applicationSupportDirectory,
in: .userDomainMask).first else { return }
let storeURL = appSupportURL
.appendingPathComponent("MyAppModel.sqlite")
let description = NSPersistentStoreDescription(url: storeURL)
container.persistentStoreDescriptions = [description]
在使用 CloudKit 同步 Core Data 时,SQLite 文件保留在 Application Support 中,CloudKit 用作传输层。在这种情况下,不要将文件排除在备份之外非常重要——否则设备之间的同步可能会中断。
Application Support 和 Documents 之间的区别——是正确组织 iOS 应用文件结构最重要的问题之一。错误的选择可能导致用户意外删除重要的应用数据,或者相反,无法找到自己的文件。
| 参数 | Application Support | Documents Directory |
|---|---|---|
| 用户访问 | 否(隐藏) | 通过 iTunes File Sharing |
| 数据类型 | 应用服务数据 | 用户文档 |
| iCloud 备份 | 是(默认) | 是(默认) |
| 删除风险 | 低(无访问权限) | 中(用户可访问) |
| 示例 | SQLite Core Data | 导出的 PDF |
简单规则:如果用户应该能看到文件并可以删除它——使用 Documents。如果文件是应用运行所需但用户无需知道——使用 Application Support。如果数据可以恢复——使用 Caches。
使用 Application Support 需要考虑几个使其区别于沙盒中其他目录的特性。遵循这些实践有助于避免数据丢失、迁移问题和应用的意外行为。
与 Documents 不同,Application Support 在首次启动时可能不存在。使用 createDirectory(at:withIntermediateDirectories:) 并设置 withIntermediateDirectories: true 参数,以确保创建完整的子目录链。
在 Application Support 内创建一个带 Bundle Identifier 的子目录。这可以将你的应用数据与其他应用的数据隔离开来(尽管沙盒已经提供了隔离),并在更换提供商时简化迁移。
import Foundation
enum AppSupport {
static func ensureDirectory() throws -> URL {
let fm = FileManager.default
let baseURL = try fm.url(
for: .applicationSupportDirectory,
in: .userDomainMask,
appropriateFor: nil,
create: true
)
let appDir = baseURL
.appendingPathComponent(Bundle.main.bundleIdentifier ?? "default")
try fm.createDirectory(at: appDir, withIntermediateDirectories: true)
return appDir
}
}
遵循这些实践可以确保应用的服务数据得到正确组织、防止用户意外删除,并能正确从备份中恢复。
常见问题
是的,Application Support 在应用安装时不会自动创建。与系统在首次启动时创建的 Documents 和 Caches 不同,Application Support 需要由开发人员使用 FileManager.createDirectory(at:withIntermediateDirectories:) 创建。这通常在 application(_:didFinishLaunchingWithOptions:) 方法中完成。
不会,通过标准 iOS 界面(Files、iTunes),用户无法访问 Application Support。但是,在删除应用本身时,整个沙盒(包括 Application Support)将被完全删除。iCloud 中的备份会保留到恢复或手动删除为止。
对于面向用户的下载视频,最好使用 Documents Directory——以便用户可以通过 Files 管理这些文件。如果视频是应用内部缓存的一部分(例如离线学习内容),可以使用 Application Support,并对大文件设置 isExcludedFromBackup 标志。
在 Application Support 内添加子目录的版本管理。更新时检查当前数据版本,如有需要创建新的子目录,保留旧目录用于回滚。只有在确认所有用户成功迁移到新版本数据后,才删除旧目录。
间接影响——是的。如果 Application Support 包含数万个小文件,FileManager.enumerator 可能会减慢初始化速度。建议限制 Application Support 中的文件数量(不超过 1000 个),并对结构化数据使用数据库(Core Data、Realm)而不是大量单独的文件。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。