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
// Option 1: NSTemporaryDirectory()
let tempDir = NSTemporaryDirectory()
let tempFile = (tempDir as NSString)
.appendingPathComponent("export_temp.pdf")
// Option 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:) должен вызываться сразу после завершения операции с временным файлом. Используй defer в Swift для гарантированного удаления даже при возникновении ошибки.
import Foundation
let tempURL = FileManager.default
.temporaryDirectory
.appendingPathComponent("upload_temp.dat")
defer {
try? FileManager.default.removeItem(at: tempURL)
}
// Work with temp file
try "temporary data".write(to: tempURL, atomically: true)
// ... file operation ...
// defer executes when scope exits
Если данные могут понадобиться через час после создания — сохраняй их в Caches или Application Support. tmp предназначена для минутных операций, не для хранения.
Соблюдение этих правил гарантирует, что временные файлы не накапливаются, место на диске используется эффективно, а приложение корректно обрабатывает любые сценарии очистки файловой системы iOS.
Часто задаваемые вопросы
Обычно путь не меняется в рамках одной сессии, но iOS не даёт гарантий. В редких случаях система может изменить tmp при переходе приложения из фона в активное состояние. Поэтому Apple рекомендует получать путь к tmp через NSTemporaryDirectory() при каждом обращении, а не сохранять его в переменную.
Файлы будут накапливаться и занимать место на диске. iOS может очистить tmp при перезагрузке устройства, но до этого момента приложение будет расходовать дисковое пространство впустую. При значительном накоплении пользователь может увидеть в настройках хранилища, что приложение занимает много места.
Да, ты можешь использовать DataProtectionType с NSFileProtectionComplete для временных файлов, содержащих чувствительные данные. Однако помни: если файл будет прочитан только в рамках текущей сессии, а затем удалён — шифрование может быть избыточным. Оценивай необходимость шифрования исходя из типа данных.
Используй ProcessInfo.processInfo.globallyUniqueString для генерации уникального идентификатора или UUID().uuidString. FileManager также предоставляет метод urlForCreatingTemporaryFile, который автоматически генерирует уникальное имя в tmp. Это гарантирует отсутствие коллизий при параллельной записи.
Косвенно — да. Apple обращает внимание на общий размер данных, которые приложение хранит на диске. Если tmp содержит гигабайты неудалённых файлов, ревьюер может отклонить приложение. Рекомендуемый лимит для tmp — не более 100 МБ в любой момент времени. Регулярно очищай tmp и проверяй размер через FileManager.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также