Temporary Directory — 是什么、临时文件以及存储管理

作者: IT Sectr 发布日期: 2026-07-10 阅读时间: 10 分钟

Temporary Directory (tmp) — 是 iOS 应用沙盒中用于存储极短期数据的目录,这些数据仅在当前应用会话中需要。根据 Apple File System Programming Guide (2024),系统可以在每次应用结束或设备重启时清理 tmp。与 Caches Directory 不同,tmp 中的临时文件不用于在启动间存储 — 开发者必须在使用后明确删除它们,以免占用磁盘空间。

主要观点

  • Temporary Directory — 用于仅在当前应用会话中所需数据的目录。
  • iOS 系统可以在设备重启或应用结束时清理 tmp。
  • 来自 tmp 的文件不包含在 iCloud 和 iTunes 备份中。
  • 通过 Swift 或 Objective-C 中的 NSTemporaryDirectory() 获取 tmp 路径。
  • 开发者必须在使用后自行删除 tmp 中的文件。

iOS 中的 Temporary Directory 是什么?

Temporary Directory(又称 tmp)— 是 iOS 应用沙盒内的目录,用于存储寿命仅限于当前会话的数据。这是所有沙盒目录中最短暂的存储。

iOS 提供 tmp 用于需要临时文件存储的操作:在将文件移动到 Documents 之前下载文件、在导出之前创建临时副本、缓冲流媒体数据。操作完成后,临时文件必须删除。

根据 Apple Developer Documentation (2024),tmp 目录是独特的,因为它的路径可能在应用启动间变化。iOS 在每次启动时为 tmp 生成新路径 — 这保证了上次会话的数据不会被意外读取。开发者绝不应该在启动间保存 tmp 路径。

重要:与 Caches Directory 不同,在该目录中数据可以存活多次启动,而 tmp 不保证会话间的长期数据存储。这是存储真正临时数据的最可靠方式。

如何获取 Temporary Directory 的路径

Swift 中,获取 tmp 路径使用全局函数 NSTemporaryDirectory() 或 FileManager.temporaryDirectory。这是所有沙盒目录中最简单的 API。

swift
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()。结果是一个包含应用临时目录完整路径的字符串。

objective-c
@import Foundation;

NSString *tempDir = NSTemporaryDirectory();
NSString *tempFile = [tempDir stringByAppendingPathComponent:@"temp_data.bin"];

与其他目录的主要区别:NSTemporaryDirectory() 不需要指定域或掩码 — 它是一个全局函数。但路径可能在下次启动时改变,因此切勿将其保存到 UserDefaults 或其他持久存储。

应该在 tmp 中存储什么数据

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 不保证它们在近期内自动清理。

Temporary Directory 与 Caches Directory

对比 tmpCaches 帮助开发者在选择存储目录时做出正确决定。选择错误可能导致数据过早丢失或无谓的空间浪费。

参数Temporary DirectoryCaches Directory
寿命仅当前会话会话间(无保证)
路径变更可每次启动改变稳定路径
自动清理重启时、卸载时空间不足时
删除由开发者操作后必须超出限额时建议
用途临时操作持久缓存

实用规则:对于创建后几秒或几分钟内删除的数据,选择 tmp。对于值得在会话间保留几小时或几天的数据,但可以重新创建的数据,选择 Caches

使用 tmp 的最佳实践

使用 Temporary Directory 需要纪律:由于 tmp 中的数据是短暂的,它们的积累可能导致无谓的空间浪费,开发者必须遵守几个关键实践。

始终在使用后删除文件

FileManager.removeItem(at:) 应在与临时文件的操作完成后立即调用。在 Swift 中使用 defer 以保证即使在出错时也能删除。

swift
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 在退出作用域时执行

不要将 tmp 用于长寿命数据

如果数据可能在创建一小时后所需 — 将它们存储在 CachesApplication Support 中。tmp 针对分钟级操作,而非存储。

遵守这些规则可保证临时文件不会积累,磁盘空间被高效利用,并且应用程序能正确处理 iOS 文件系统的任何清理场景。

常见问题

Temporary Directory 的路径在应用运行期间可能改变吗?

通常路径在一次会话内不会改变,但 iOS 不提供保证。在罕见情况下,系统可能在应用从后台切换到前台时改变 tmp。因此 Apple 建议每次调用时通过 NSTemporaryDirectory() 获取 tmp 路径,而不是将其存储在变量中。

如果不删除 tmp 中的文件会怎样?

文件会积累并占用磁盘空间。iOS 可以在设备重启时清理 tmp,但在此之后应用将浪费磁盘空间。当积累显著时,用户可能在存储设置中看到应用占用大量空间。

tmp 适合加密临时数据吗?

可以,您可以使用 DataProtectionType 与 NSFileProtectionComplete 来处理包含敏感数据的临时文件。但请记住:如果文件仅在当前会话中读取然后删除 — 加密可能是多余的。根据数据类型评估加密需求。

如何在 tmp 中创建唯一文件名而不产生冲突?

使用 ProcessInfo.processInfo.globallyUniqueString 生成唯一标识符或 UUID().uuidString。FileManager 还提供了 urlForCreatingTemporaryFile 方法,可以在 tmp 中自动生成唯一名称。这保证了并行写入时不会产生冲突。

tmp 大小会影响 App Store 审核吗?

间接 — 会。Apple 关注应用在磁盘上存储的数据总大小。如果 tmp 包含几吉字节未删除的文件,审核人员可能会拒绝应用。建议的 tmp 限制是任何时刻不超过 100 MB。定期清理 tmp 并通过 FileManager 检查其大小。

总结

  • Temporary Directory (tmp) — 用于寿命仅限于当前应用会话的数据的目录。
  • tmp 路径可能在启动间改变 — 不要将其存储在持久存储中。
  • 系统可以在设备重启或应用卸载时清理 tmp。
  • 来自 tmp 的文件不包含在 iCloud 和 iTunes 备份中。
  • 与 Caches Directory 不同,tmp 不用于会话间的存储。
  • 开发者必须使用 FileManager.removeItem 明确删除临时文件。
  • 在 Swift 中使用 defer 以保证在任何操作结果下都能删除临时文件。

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读