Temporary Directory (tmp) — je adresář v sandboxu iOS aplikace pro ukládání velmi krátkodobých dat, která jsou potřeba pouze v rámci aktuální relace aplikace. Podle Apple File System Programming Guide (2024) může systém tmp vyčistit při každém ukončení aplikace nebo při restartu zařízení. Na rozdíl od Caches Directory nejsou dočasné soubory v tmp určeny k ukládání mezi spuštěními — vývojář je musí po použití explicitně odstranit, aby nezabíraly místo na disku.
Hlavní body
Temporary Directory (také známý jako tmp) — je adresář uvnitř sandboxu iOS aplikace, určený pro ukládání dat, jejichž životnost je omezena na aktuální relaci. Toto je nejkratší úložiště ze všech adresářů sandboxu.
iOS poskytuje tmp pro operace vyžadující dočasné ukládání souborů: stažení souboru před přesunem do Documents, vytvoření dočasné kopie před exportem, bufferování streamovaných dat. Po dokončení operace musí být dočasné soubory odstraněny.
Podle Apple Developer Documentation (2024) je tmp adresář jedinečný, protože jeho cesta se může měnit mezi spuštěními aplikace. iOS generuje novou cestu k tmp při každém spuštění — to zaručuje, že data z předchozí relace nebudou náhodně přečtena. Vývojář by nikdy neměl ukládat cestu k tmp mezi spuštěními.
Důležité: na rozdíl od Caches Directory, kde data mohou přežít několik spuštění, tmp nezaručuje ukládání dat mezi relacemi z dlouhodobého hlediska. Toto je nejspolehlivější způsob ukládání skutečně dočasných dat.
Ve Swift se pro získání cesty k tmp používá globální funkce NSTemporaryDirectory() nebo FileManager.temporaryDirectory. Toto je nejjednodušší API ze všech adresářů sandboxu.
import Foundation
// Možnost 1: NSTemporaryDirectory()
let tempDir = NSTemporaryDirectory()
let tempFile = (tempDir as NSString)
.appendingPathComponent("export_temp.pdf")
// Možnost 2: FileManager.temporaryDirectory (URL)
let tempURL = FileManager.default.temporaryDirectory
let exportURL = tempURL.appendingPathComponent("export_temp.pdf")
Objective-C používá stejnou globální funkci NSTemporaryDirectory(). Výsledkem je řetězec s úplnou cestou k dočasnému adresáři aplikace.
@import Foundation;
NSString *tempDir = NSTemporaryDirectory();
NSString *tempFile = [tempDir stringByAppendingPathComponent:@"temp_data.bin"];
Klíčový rozdíl od ostatních adresářů: NSTemporaryDirectory() nevyžaduje zadání domény nebo masky — je to globální funkce. Cesta se však může změnit při příštím spuštění, proto ji nikdy neukládejte do UserDefaults nebo jiného trvalého úložiště.
Temporary Directory je určen pro přesně definovanou sadu scénářů. Vývojáři často zaměňují tmp s Caches a umísťují do tmp data, která by měla žít déle než jednu relaci. Podívejme se na správné případy použití.
Soubory vytvářené během exportu dat: dočasná kopie zprávy před odesláním e-mailem, komprimovaný archiv před stažením, dočasný soubor konverze formátů. Po dokončení exportu musí být soubor odstraněn.
Dočasné buffery pro záznam audia, videa nebo streamovaných dat zpracovávaných v reálném čase. Například nahrávání hlasu před uložením do trvalého úložiště nebo bufferování video streamu při streamování.
| Scénář | Adresář | Odůvodnění |
|---|---|---|
| Export PDF před odesláním | tmp | Soubor není potřeba po odeslání |
| Cache obrázků | Caches | Užitečné mezi relacemi |
| Stažení souboru před přesunem | tmp | Dočasné úložiště |
| Logy relace | tmp | Aktuální pouze v relaci |
| Úpravy dokumentu | tmp | Verze před uložením |
Pokud jsou data potřeba jen tady a teď — použijte tmp. Pokud by se mohla hodit v příští relaci — použijte Caches. Pokud je ztráta dat nepřijatelná — použijte Documents.
iOS spravuje životní cyklus tmp jinak než ostatní adresáře sandboxu. Pochopení tohoto cyklu je kritické pro správný návrh ukládání souborů v aplikaci.
Při každém spuštění aplikace může iOS přidělit novou cestu pro tmp. Předchozí cesta se stává nedostupnou, i když fyzické soubory mohou zůstat na disku až do restartu zařízení. Právě z tohoto důvodu Apple důrazně doporučuje neukládat cestu k tmp mezi relacemi.
Podle Apple Tech Note TN2150 (2024) může systém vyčistit tmp v následujících případech: při restartu zařízení, při dosažení limitu místa na disku, při uvolnění aplikace (Offload). Na rozdíl od Caches není tmp určen k ukládání dat ani v rámci několika spuštění — to je nejméně spolehlivé úložiště v sandboxu.
Vývojář je povinen explicitně odstranit dočasné soubory po dokončení operace pomocí FileManager.removeItem(at:). Neodstraněné soubory v tmp se hromadí a zabírají místo na disku — iOS nezaručuje jejich automatické vyčištění v blízké budoucnosti.
Srovnání tmp a Caches pomáhá vývojářům učinit správné rozhodnutí při výběru adresáře pro ukládání. Chyba ve výběru může vést buď k předčasné ztrátě dat, nebo k neopodstatněnému plýtvání místem.
| Parametr | Temporary Directory | Caches Directory |
|---|---|---|
| Životnost | Pouze aktuální relace | Mezi relacemi (bez záruky) |
| Změna cesty | Může se měnit každé spuštění | Stabilní cesta |
| Automatické čištění | Při restartu, při uvolnění | Při nedostatku místa |
| Odstranění vývojářem | Povinné po operaci | Doporučeno při překročení limitu |
| Použití | Dočasné operace | Trvalá cache |
Praktické pravidlo: zvolte tmp pro data, která budou odstraněna během několika sekund nebo minut po vytvoření. Zvolte Caches pro data, která stojí za to uchovat několik hodin nebo dní mezi relacemi, ale lze je znovu vytvořit.
Práce s Temporary Directory vyžaduje disciplínu: protože data v tmp jsou krátkodobá a jejich hromadění může vést k neopodstatněnému plýtvání místem, musí vývojář dodržovat několik klíčových postupů.
FileManager.removeItem(at:) by měl být volán ihned po dokončení operace s dočasným souborem. Použijte defer ve Swift pro zaručené odstranění i v případě chyby.
import Foundation
let tempURL = FileManager.default
.temporaryDirectory
.appendingPathComponent("upload_temp.dat")
defer {
try? FileManager.default.removeItem(at: tempURL)
}
// Práce s dočasným souborem
try "temporary data".write(to: tempURL, atomically: true)
// ... operace se souborem ...
// defer se provede při opuštění rozsahu
Pokud by data mohla být potřeba hodinu po vytvoření — uložte je do Caches nebo Application Support. tmp je určen pro minutové operace, ne pro ukládání.
Dodržování těchto pravidel zaručuje, že se dočasné soubory nehromadí, místo na disku je využíváno efektivně a aplikace správně zpracovává jakýkoli scénář čištění souborového systému iOS.
Často kladené otázky
Obvykle se cesta nemění v rámci jedné relace, ale iOS neposkytuje záruky. Ve vzácných případech může systém změnit tmp při přechodu aplikace z pozadí do aktivního stavu. Proto Apple doporučuje získávat cestu k tmp pomocí NSTemporaryDirectory() při každém volání, namísto ukládání do proměnné.
Soubory se budou hromadit a zabírat místo na disku. iOS může vyčistit tmp při restartu zařízení, ale do té doby bude aplikace plýtvat místem na disku. Při výrazném nahromadění může uživatel v nastavení úložiště vidět, že aplikace zabírá mnoho místa.
Ano, můžete použít DataProtectionType s NSFileProtectionComplete pro dočasné soubory obsahující citlivá data. Pamatujte však: pokud bude soubor přečten pouze v aktuální relaci a poté odstraněn — šifrování může být nadbytečné. Posuďte potřebu šifrování na základě typu dat.
Použijte ProcessInfo.processInfo.globallyUniqueString pro generování jedinečného identifikátoru nebo UUID().uuidString. FileManager také poskytuje metodu urlForCreatingTemporaryFile, která automaticky generuje jedinečný název v tmp. To zaručuje absenci kolizí při paralelním zápisu.
Nepřímo — ano. Apple věnuje pozornost celkové velikosti dat, která aplikace ukládá na disk. Pokud tmp obsahuje gigabajty neodstraněných souborů, recenzent může aplikaci odmítnout. Doporučený limit pro tmp — ne více než 100 MB v každém okamžiku. Pravidelně čistěte tmp a kontrolujte jeho velikost pomocí FileManager.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také