Temporary Directory (tmp) — to katalog w piaskownicy aplikacji iOS do przechowywania bardzo krótkotrwałych danych, które są potrzebne tylko w bieżącej sesji aplikacji. Według Apple File System Programming Guide (2024), system może czyścić tmp przy każdym zakończeniu aplikacji lub przy restarcie urządzenia. W przeciwieństwie do Caches Directory, pliki tymczasowe w tmp nie są przeznaczone do przechowywania między uruchomieniami — programista musi je jawnie usuwać po użyciu, aby nie zajmować miejsca na dysku.
Najważniejsze
Temporary Directory (znany również jako tmp) — to katalog wewnątrz piaskownicy aplikacji iOS, przeznaczony do przechowywania danych, których czas życia jest ograniczony do bieżącej sesji. To najbardziej krótkotrwałe przechowywanie spośród wszystkich katalogów piaskownicy.
iOS udostępnia tmp do operacji wymagających pośredniego przechowywania plików: pobieranie pliku przed przeniesieniem do Documents, tworzenie tymczasowej kopii przed eksportem, buforowanie danych strumieniowych. Po zakończeniu operacji pliki tymczasowe powinny zostać usunięte.
Według Apple Developer Documentation (2024), katalog tmp jest wyjątkowy, ponieważ jego ścieżka może się zmieniać między uruchomieniami aplikacji. iOS generuje nową ścieżkę do tmp przy każdym uruchomieniu — gwarantuje to, że dane z poprzedniej sesji nie zostaną przypadkowo odczytane. Programista nigdy nie powinien zapisywać ścieżki do tmp między uruchomieniami.
Wartością uwagi: w przeciwieństwie do Caches Directory, gdzie dane mogą przetrwać kilka uruchomień, tmp nie gwarantuje przechowywania danych między sesjami w długoterminowej perspektywie. To najbardziej niezawodny sposób przechowywania naprawdę tymczasowych danych.
W Swift do uzyskania ścieżki do tmp używa się globalnej funkcji NSTemporaryDirectory() lub FileManager.temporaryDirectory. To najprostsze API spośród wszystkich katalogów piaskownicy.
import Foundation
// Opcja 1: NSTemporaryDirectory()
let tempDir = NSTemporaryDirectory()
let tempFile = (tempDir as NSString)
.appendingPathComponent("export_temp.pdf")
// Opcja 2: FileManager.temporaryDirectory (URL)
let tempURL = FileManager.default.temporaryDirectory
let exportURL = tempURL.appendingPathComponent("export_temp.pdf")
Objective-C używa tej samej globalnej funkcji NSTemporaryDirectory(). Wynik — ciąg znaków z pełną ścieżką do tymczasowego katalogu aplikacji.
@import Foundation;
NSString *tempDir = NSTemporaryDirectory();
NSString *tempFile = [tempDir stringByAppendingPathComponent:@"temp_data.bin"];
Kluczowa różnica od innych katalogów: NSTemporaryDirectory() nie wymaga podania domeny ani maski — to funkcja globalna. Jednak ścieżka może się zmienić przy następnym uruchomieniu, więc nigdy nie zapisuj jej w UserDefaults ani innym trwałym przechowywaniu.
Temporary Directory jest przeznaczona dla ściśle określonego zestawu scenariuszy. Programiści często mylą tmp z Caches, umieszczając w tmp dane, które powinny żyć dłużej niż jedna sesja. Rozważmy prawidłowe przypadki użycia.
Pliki tworzone w procesie eksportu danych: tymczasowa kopia raportu przed wysłaniem pocztą, skompresowane archiwum przed pobraniem, pośredni plik konwersji formatów. Po zakończeniu eksportu plik powinien zostać usunięty.
Tymczasowe bufory do zapisu audio, wideo lub danych strumieniowych przetwarzanych w czasie rzeczywistym. Na przykład nagrywanie głosu przed zapisaniem w stałym przechowywaniu lub buforowanie strumienia wideo podczas streamingu.
| Scenariusz | Katalog | Uzasadnienie |
|---|---|---|
| Eksport PDF przed wysłaniem | tmp | Plik nie jest potrzebny po wysłaniu |
| Pamięć podręczna obrazów | Caches | Przydatne między sesjami |
| Pobieranie pliku przed przeniesieniem | tmp | Przechowywanie pośrednie |
| Logi sesji | tmp | Aktualne tylko w sesji |
| Edycja dokumentu | tmp | Wersja przed zapisaniem |
Jeśli dane są potrzebne tylko tu i teraz — używaj tmp. Jeśli mogą się przydać w następnej sesji — używaj Caches. Jeśli utrata danych jest niedopuszczalna — używaj Documents.
iOS zarządza cyklem życia tmp inaczej niż innymi katalogami piaskownicy. Zrozumienie tego cyklu jest krytycznie ważne dla prawidłowego projektowania przechowywania plików w aplikacji.
Przy każdym uruchomieniu aplikacji iOS może przydzielić nową ścieżkę dla tmp. Poprzednia ścieżka przestaje być dostępna, chociaż fizyczne pliki mogą pozostać na dysku aż do restartu urządzenia. Właśnie z tego powodu Apple zdecydowanie zaleca, aby nie zapisywać ścieżki do tmp między sesjami.
Według Apple Tech Note TN2150 (2024), system może czyścić tmp w następujących przypadkach: przy restarcie urządzenia, po osiągnięciu limitu miejsca na dysku, przy wyładowaniu aplikacji (Offload). W przeciwieństwie do Caches, tmp nie jest przeznaczona do przechowywania danych nawet w ramach kilku uruchomień — to najbardziej zawodne przechowywanie w piaskownicy.
Programista ma obowiązek jawnego usuwania plików tymczasowych po zakończeniu operacji za pomocą FileManager.removeItem(at:). Nieusunięte pliki w tmp gromadzą się i zajmują miejsce na dysku — iOS nie gwarantuje ich automatycznego czyszczenia w najbliższym czasie.
Porównanie tmp i Caches pomaga programistom podejmować właściwe decyzje przy wyborze katalogu do przechowywania. Błąd w wyborze może prowadzić albo do przedwczesnej utraty danych, albo do nieuzasadnionego zużycia miejsca.
| Parametr | Temporary Directory | Caches Directory |
|---|---|---|
| Czas życia | Tylko bieżąca sesja | Między sesjami (bez gwarancji) |
| Zmiana ścieżki | Może się zmieniać co uruchomienie | Stabilna ścieżka |
| Automatyczne czyszczenie | Przy restarcie, przy wyładowaniu | Przy braku miejsca |
| Usuwanie przez programistę | Obowiązkowe po operacji | Zalecane po przekroczeniu limitu |
| Zastosowanie | Operacje pośrednie | Trwała pamięć podręczna |
Praktyczna zasada: wybieraj tmp dla danych, które zostaną usunięte w ciągu kilku sekund lub minut po utworzeniu. Wybieraj Caches dla danych, które warto zachować na kilka godzin lub dni między sesjami, ale które można odtworzyć.
Praca z Temporary Directory wymaga dyscypliny: ponieważ dane w tmp są krótkotrwałe, a ich gromadzenie może prowadzić do nieuzasadnionego zużycia miejsca, programista powinien przestrzegać kilku kluczowych praktyk.
FileManager.removeItem(at:) powinien być wywoływany natychmiast po zakończeniu operacji na pliku tymczasowym. Używaj defer w Swift, aby zagwarantować usunięcie nawet w przypadku wystąpienia błędu.
import Foundation
let tempURL = FileManager.default
.temporaryDirectory
.appendingPathComponent("upload_temp.dat")
defer {
try? FileManager.default.removeItem(at: tempURL)
}
// Praca z plikiem tymczasowym
try "temporary data".write(to: tempURL, atomically: true)
// ... operacja na pliku ...
// defer wykonuje się po wyjściu z zakresu
Jeśli dane mogą być potrzebne za godzinę po utworzeniu — zapisz je w Caches lub Application Support. tmp jest przeznaczona do minutowych operacji, nie do przechowywania.
Przestrzeganie tych zasad gwarantuje, że pliki tymczasowe nie będą się gromadzić, miejsce na dysku będzie używane efektywnie, a aplikacja poprawnie obsłuży dowolne scenariusze czyszczenia systemu plików iOS.
Często zadawane pytania
Zazwyczaj ścieżka nie zmienia się w ramach jednej sesji, ale iOS nie daje gwarancji. W rzadkich przypadkach system może zmienić tmp przy przejściu aplikacji z tła do stanu aktywnego. Dlatego Apple zaleca uzyskiwanie ścieżki do tmp przez NSTemporaryDirectory() przy każdym odwołaniu, zamiast zapisywania jej w zmiennej.
Pliki będą się gromadzić i zajmować miejsce na dysku. iOS może wyczyścić tmp przy restarcie urządzenia, ale do tego momentu aplikacja będzie marnować miejsce na dysku. Przy znaczącym nagromadzeniu użytkownik może zobaczyć w ustawieniach pamięci, że aplikacja zajmuje dużo miejsca.
Tak, możesz użyć DataProtectionType z NSFileProtectionComplete dla plików tymczasowych zawierających wrażliwe dane. Pamiętaj jednak: jeśli plik będzie odczytany tylko w ramach bieżącej sesji, a następnie usunięty — szyfrowanie może być zbędne. Oceń potrzebę szyfrowania w zależności od rodzaju danych.
Użyj ProcessInfo.processInfo.globallyUniqueString do generowania unikalnego identyfikatora lub UUID().uuidString. FileManager udostępnia również metodę urlForCreatingTemporaryFile, która automatycznie generuje unikalną nazwę w tmp. To gwarantuje brak kolizji przy równoległym zapisie.
Pośrednio — tak. Apple zwraca uwagę na całkowity rozmiar danych przechowywanych przez aplikację na dysku. Jeśli tmp zawiera gigabajty nieusuniętych plików, recenzent może odrzucić aplikację. Zalecany limit dla tmp — nie więcej niż 100 MB w dowolnym momencie. Regularnie czyść tmp i sprawdzaj rozmiar przez FileManager.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również