Temporary Directory (tmp) — це каталог в пісочниці (sandbox) додатка iOS для зберігання надзвичайно короткочасових даних, які потрібні лише в межах поточної сесії додатка. Згідно з Apple File System Programming Guide (2024), система може очищати tmp при кожному завершенні додатка або перезавантаженні пристрою. На відміну від Caches Directory, тимчасові файли в tmp не призначені для зберігання між запусками — розробник повинен явно видаляти їх після використання, щоб не витрачати місце на диску.
Головне
Temporary Directory (також відомий як tmp) — це каталог всередині пісочниці додатка iOS, призначений для зберігання даних, чий термін життя обмежений поточною сесією. Це найкоротшовачніше сховище серед усіх каталогів пісочниці.
iOS надає tmp для операцій, які потребують проміжного файлового зберігання: завантаження файлу перед переміщенням в Documents, створення тимчасової копії перед експортом, буферизація потокових даних. Після завершення операції тимчасові файли повинні бути видалені.
Згідно з документацією Apple Developer (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 рекомендує викликати NSTemporaryDirectory() кожного разу, коли потрібен шлях, а не зберігати його в змінній.
Файли накопичуватимуться та займатимуть місце на диску. iOS може очистити tmp при перезавантаженні пристрою, але до того часу додаток буде витрачати місце на диску марно. При значному накопиченні користувач може побачити в налаштуваннях сховища, що додаток займає багато місця.
Так, ви можете використовувати DataProtectionType з NSFileProtectionComplete для тимчасових файлів, що містять чутливі дані. Однак пам’ятайте: якщо файл буде прочитаний лише в поточній сесії, а потім видалений — шифрування може бути надлишковим. Оцініть необхідність шифрування виходячи з типу даних.
Використовуйте ProcessInfo.processInfo.globallyUniqueString для генерації унікального ідентифікатора або UUID().uuidString. FileManager також надає метод urlForCreatingTemporaryFile, який автоматично створює унікальне ім’я в tmp. Це гарантує відсутність колізій при паралельному записі.
Опосередковано — так. Apple звертає увагу на загальний обсяг даних, які додаток зберігає на диску. Якщо tmp містить гігабайти не видалених файлів, рецензент може відхилити додаток. Рекомендована межа для tmp — не більше 100 МБ в будь-який момент часу. Регулярно очищайте tmp та перевіряйте його розмір через FileManager.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також