Temporary Directory (tmp) — 是 iOS 应用沙盒中用于存储极短期数据的目录,这些数据仅在当前应用会话中需要。根据 Apple File System Programming Guide (2024),系统可以在每次应用结束或设备重启时清理 tmp。与 Caches Directory 不同,tmp 中的临时文件不用于在启动间存储 — 开发者必须在使用后明确删除它们,以免占用磁盘空间。
主要观点
Temporary Directory(又称 tmp)— 是 iOS 应用沙盒内的目录,用于存储寿命仅限于当前会话的数据。这是所有沙盒目录中最短暂的存储。
iOS 提供 tmp 用于需要临时文件存储的操作:在将文件移动到 Documents 之前下载文件、在导出之前创建临时副本、缓冲流媒体数据。操作完成后,临时文件必须删除。
根据 Apple Developer Documentation (2024),tmp 目录是独特的,因为它的路径可能在应用启动间变化。iOS 在每次启动时为 tmp 生成新路径 — 这保证了上次会话的数据不会被意外读取。开发者绝不应该在启动间保存 tmp 路径。
重要:与 Caches Directory 不同,在该目录中数据可以存活多次启动,而 tmp 不保证会话间的长期数据存储。这是存储真正临时数据的最可靠方式。
在 Swift 中,获取 tmp 路径使用全局函数 NSTemporaryDirectory() 或 FileManager.temporaryDirectory。这是所有沙盒目录中最简单的 API。
import Foundation
// 选项 1:NSTemporaryDirectory()
let tempDir = NSTemporaryDirectory()
let tempFile = (tempDir as NSString)
.appendingPathComponent("export_temp.pdf")
// 选项 2:FileManager.temporaryDirectory (URL)
let tempURL = FileManager.default.temporaryDirectory
let exportURL = tempURL.appendingPathComponent("export_temp.pdf")
Objective-C 使用相同的全局函数 NSTemporaryDirectory()。结果是一个包含应用临时目录完整路径的字符串。
@import Foundation;
NSString *tempDir = NSTemporaryDirectory();
NSString *tempFile = [tempDir stringByAppendingPathComponent:@"temp_data.bin"];
与其他目录的主要区别:NSTemporaryDirectory() 不需要指定域或掩码 — 它是一个全局函数。但路径可能在下次启动时改变,因此切勿将其保存到 UserDefaults 或其他持久存储。
Temporary Directory 针对一组严格定义的场景而设计。开发者经常将 tmp 与 Caches 混淆,将应该持续超过一次会话的数据放在 tmp 中。让我们看看正确的使用场景。
文件在数据导出过程中创建:发送电子邮件前报告的临时副本、下载前的压缩归档、格式转换的临时文件。导出完成后,文件必须删除。
临时缓冲区用于录制音频、视频或实时处理的流媒体数据。例如,在保存到永久存储前录制声音或在流媒体播放时缓冲视频流。
| 场景 | 目录 | 理由 |
|---|---|---|
| 导出 PDF 发送前 | tmp | 发送后文件不必要 |
| 缓存图片 | Caches | 会话间有用 |
| 下载文件移动前 | tmp | 临时存储 |
| 会话日志 | tmp | 仅在会话中有效 |
| 编辑文档 | tmp | 保存前的版本 |
如果数据只在此地此时所需 — 使用 tmp。如果在下次会话中可能有用 — 使用 Caches。如果数据丢失不可接受 — 使用 Documents。
iOS 管理 tmp 生命周期的方式与沙盒的其他目录不同。理解这个周期对于在应用中正确设计文件存储至关重要。
在每次启动应用时,iOS 可以为 tmp 分配新路径。先前的路径变得不可访问,尽管物理文件可能一直保留在磁盘上直到设备重启。正是因为这个原因,Apple 强烈建议不要在会话间保存 tmp 路径。
根据 Apple Tech Note TN2150 (2024),系统可以在以下情况下清理 tmp:设备重启时、磁盘空间达到限额时、应用被卸载 (Offload) 时。与 Caches 不同,tmp 不用于存储数据,即使在多次启动内 — 它是沙盒中最不可靠的存储。
开发者有义务在操作完成后使用 FileManager.removeItem(at:) 明确删除临时文件。未删除的文件在 tmp 中积累并占用磁盘空间 — iOS 不保证它们在近期内自动清理。
对比 tmp 和 Caches 帮助开发者在选择存储目录时做出正确决定。选择错误可能导致数据过早丢失或无谓的空间浪费。
| 参数 | Temporary Directory | Caches Directory |
|---|---|---|
| 寿命 | 仅当前会话 | 会话间(无保证) |
| 路径变更 | 可每次启动改变 | 稳定路径 |
| 自动清理 | 重启时、卸载时 | 空间不足时 |
| 删除由开发者 | 操作后必须 | 超出限额时建议 |
| 用途 | 临时操作 | 持久缓存 |
实用规则:对于创建后几秒或几分钟内删除的数据,选择 tmp。对于值得在会话间保留几小时或几天的数据,但可以重新创建的数据,选择 Caches。
使用 Temporary Directory 需要纪律:由于 tmp 中的数据是短暂的,它们的积累可能导致无谓的空间浪费,开发者必须遵守几个关键实践。
FileManager.removeItem(at:) 应在与临时文件的操作完成后立即调用。在 Swift 中使用 defer 以保证即使在出错时也能删除。
import Foundation
let tempURL = FileManager.default
.temporaryDirectory
.appendingPathComponent("upload_temp.dat")
defer {
try? FileManager.default.removeItem(at: tempURL)
}
// 处理临时文件
try "temporary data".write(to: tempURL, atomically: true)
// ... 文件操作 ...
// defer 在退出作用域时执行
如果数据可能在创建一小时后所需 — 将它们存储在 Caches 或 Application Support 中。tmp 针对分钟级操作,而非存储。
遵守这些规则可保证临时文件不会积累,磁盘空间被高效利用,并且应用程序能正确处理 iOS 文件系统的任何清理场景。
常见问题
通常路径在一次会话内不会改变,但 iOS 不提供保证。在罕见情况下,系统可能在应用从后台切换到前台时改变 tmp。因此 Apple 建议每次调用时通过 NSTemporaryDirectory() 获取 tmp 路径,而不是将其存储在变量中。
文件会积累并占用磁盘空间。iOS 可以在设备重启时清理 tmp,但在此之后应用将浪费磁盘空间。当积累显著时,用户可能在存储设置中看到应用占用大量空间。
可以,您可以使用 DataProtectionType 与 NSFileProtectionComplete 来处理包含敏感数据的临时文件。但请记住:如果文件仅在当前会话中读取然后删除 — 加密可能是多余的。根据数据类型评估加密需求。
使用 ProcessInfo.processInfo.globallyUniqueString 生成唯一标识符或 UUID().uuidString。FileManager 还提供了 urlForCreatingTemporaryFile 方法,可以在 tmp 中自动生成唯一名称。这保证了并行写入时不会产生冲突。
间接 — 会。Apple 关注应用在磁盘上存储的数据总大小。如果 tmp 包含几吉字节未删除的文件,审核人员可能会拒绝应用。建议的 tmp 限制是任何时刻不超过 100 MB。定期清理 tmp 并通过 FileManager 检查其大小。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。