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:) трябва да бъде извикан незабавно след завършване на операцията с временния файл. Използвайте 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 се изпълнява при излизане от обхвата
Ако данните може да са необходими един час след създаване — запазете ги в 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 MB във всеки един момент. Редовно почиствайте tmp и проверявайте размера му чрез FileManager.
Резюме
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също