Temporary Directory (tmp) è una directory nella sandbox delle app iOS per memorizzare dati estremamente a breve termine che servono solo durante la sessione corrente dell'app. Secondo l'Apple File System Programming Guide (2024), il sistema può cancellare tmp a ogni terminazione dell'app o riavvio del dispositivo. A differenza di Caches Directory, i file temporanei in tmp non sono destinati a persistere tra le esecuzioni — lo sviluppatore deve eliminarli esplicitamente dopo l'uso per non sprecare spazio su disco.
Punti chiave
Temporary Directory (noto anche come tmp) è una directory all'interno della sandbox delle app iOS progettata per memorizzare dati la cui durata è limitata alla sessione corrente. È l'archivio più effimero tra tutte le directory della sandbox.
iOS fornisce tmp per operazioni che richiedono archiviazione intermedia di file: scaricare un file prima di spostarlo in Documents, creare una copia temporanea prima dell'esportazione, bufferizzare dati in streaming. Una volta completata l'operazione, i file temporanei devono essere eliminati.
Secondo la Documentazione Apple Developer (2024), la directory tmp è unica perché il suo percorso può cambiare tra le esecuzioni dell'app. iOS genera un nuovo percorso tmp a ogni avvio — questo garantisce che i dati della sessione precedente non vengano letti accidentalmente. Lo sviluppatore non deve mai salvare il percorso di tmp tra le esecuzioni.
Importante: a differenza di Caches Directory, dove i dati possono sopravvivere a diverse esecuzioni, tmp non garantisce la persistenza dei dati tra le sessioni a lungo termine. È il modo più affidabile per archiviare dati veramente temporanei.
In Swift, per ottenere il percorso di tmp si usa la funzione globale NSTemporaryDirectory() o FileManager.temporaryDirectory. Queste sono le API più semplici tra tutte le directory della sandbox.
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 usa la stessa funzione globale NSTemporaryDirectory(). Il risultato è una stringa con il percorso completo della directory temporanea dell'app.
@import Foundation;
NSString *tempDir = NSTemporaryDirectory();
NSString *tempFile = [tempDir stringByAppendingPathComponent:@"temp_data.bin"];
Una differenza fondamentale rispetto ad altre directory: NSTemporaryDirectory() non richiede di specificare un dominio o una maschera di ricerca — è una funzione globale. Tuttavia, il percorso potrebbe cambiare al prossimo avvio, quindi non salvarlo mai in UserDefaults o in altro archivio persistente.
Temporary Directory è destinata a un insieme rigorosamente definito di scenari. Gli sviluppatori spesso confondono tmp con Caches, inserendo in tmp dati che dovrebbero durare più di una sessione. Vediamo i casi d'uso corretti.
File creati durante l'esportazione dei dati: una copia temporanea di un report prima di inviarlo via email, un archivio compresso prima del caricamento, un file intermedio di conversione formato. Una volta completata l'esportazione, il file deve essere eliminato.
Buffer temporanei per registrare audio, video o dati in streaming elaborati in tempo reale. Ad esempio, registrazione vocale prima di salvare nell'archivio permanente, o bufferizzazione del flusso video durante lo streaming.
| Scenario | Directory | Motivazione |
|---|---|---|
| Esportare PDF prima dell'invio | tmp | File non necessario dopo l'invio |
| Cache di immagini | Caches | Utile tra le sessioni |
| Scaricare file prima di spostare | tmp | Archiviazione intermedia |
| Log di sessione | tmp | Rilevanti solo durante la sessione |
| Modificare documento | tmp | Versione prima del salvataggio |
Se i dati servono solo qui e ora — usa tmp. Se potrebbero essere utili nella prossima sessione — usa Caches. Se la perdita di dati è inaccettabile — usa Documents.
iOS gestisce il ciclo di vita di tmp in modo diverso dalle altre directory della sandbox. Comprendere questo ciclo è fondamentale per progettare correttamente l'archiviazione dei file nell'app.
A ogni avvio dell'app, iOS può allocare un nuovo percorso per tmp. Il percorso precedente diventa inaccessibile, sebbene i file fisici possano rimanere sul disco fino al riavvio del dispositivo. Questo è il motivo per cui Apple raccomanda vivamente di non salvare il percorso di tmp tra le sessioni.
Secondo Apple Tech Note TN2150 (2024), il sistema può cancellare tmp nei seguenti casi: riavvio del dispositivo, raggiungimento del limite di spazio su disco, scaricamento dell'app (Offload). A differenza di Caches, tmp non è progettato per conservare dati nemmeno tra più esecuzioni — è l'archivio meno affidabile della sandbox.
Lo sviluppatore deve eliminare esplicitamente i file temporanei dopo aver completato un'operazione usando FileManager.removeItem(at:). I file non eliminati in tmp si accumulano e sprecano spazio su disco — iOS non garantisce la loro pulizia automatica nel prossimo futuro.
Confrontare tmp e Caches aiuta gli sviluppatori a prendere la decisione giusta nella scelta di una directory per l'archiviazione. Una scelta errata può portare a una perdita prematura di dati o a un consumo di spazio non necessario.
| Parametro | Temporary Directory | Caches Directory |
|---|---|---|
| Durata | Solo sessione corrente | Tra sessioni (senza garanzie) |
| Cambio percorso | Può cambiare a ogni avvio | Percorso stabile |
| Pulizia automatica | Al riavvio, allo scaricamento | Quando manca spazio |
| Eliminazione sviluppatore | Obbligatoria dopo operazione | Consigliata al superamento limite |
| Utilizzo | Operazioni intermedie | Cache persistente |
Una regola pratica: scegli tmp per dati che verranno eliminati entro secondi o minuti dalla creazione. Scegli Caches per dati che è utile conservare per ore o giorni tra le sessioni ma che possono essere rigenerati.
Lavorare con Temporary Directory richiede disciplina: poiché i dati in tmp sono di breve durata e il loro accumulo può portare a spreco di spazio, gli sviluppatori dovrebbero seguire diverse pratiche chiave.
FileManager.removeItem(at:) deve essere chiamato immediatamente dopo aver completato un'operazione con un file temporaneo. Usa defer in Swift per garantire l'eliminazione anche in caso di errore.
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
Se i dati potrebbero servire un'ora dopo la creazione — salvali in Caches o Application Support. tmp è progettato per operazioni di minuti, non per l'archiviazione.
Seguire queste regole garantisce che i file temporanei non si accumulino, lo spazio su disco sia utilizzato in modo efficiente e l'app gestisca correttamente qualsiasi scenario di pulizia del file system iOS.
Domande frequenti
Di solito il percorso non cambia all'interno di una singola sessione, ma iOS non lo garantisce. In rari casi, il sistema può modificare tmp quando l'app passa dallo sfondo al primo piano. Ecco perché Apple raccomanda di chiamare NSTemporaryDirectory() ogni volta che serve il percorso piuttosto che salvarlo in una variabile.
I file si accumuleranno e occuperanno spazio su disco. iOS può cancellare tmp al riavvio del dispositivo, ma fino ad allora l'app sprecherà spazio su disco. Con un accumulo significativo, l'utente potrebbe vedere nelle impostazioni di archiviazione che l'app occupa molto spazio.
Sì, puoi usare DataProtectionType con NSFileProtectionComplete per file temporanei contenenti dati sensibili. Tuttavia, tieni presente: se il file verrà letto solo nella sessione corrente e poi eliminato, la crittografia potrebbe essere eccessiva. Valuta la necessità della crittografia in base al tipo di dati.
Usa ProcessInfo.processInfo.globallyUniqueString per generare un identificatore univoco, o UUID().uuidString. FileManager fornisce anche il metodo urlForCreatingTemporaryFile, che genera automaticamente un nome univoco in tmp. Questo garantisce l'assenza di collisioni durante scritture parallele.
Indirettamente — sì. Apple presta attenzione alla quantità totale di dati che l'app memorizza su disco. Se tmp contiene gigabyte di file non eliminati, il revisore potrebbe rifiutare l'app. Il limite raccomandato per tmp è di non superare 100 MB in qualsiasi momento. Pulisci tmp regolarmente e verifica la sua dimensione tramite FileManager.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche