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
// 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と混同し、1セッション以上持続すべきデータを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:)は、一時ファイルを使用した操作が完了したらすぐに呼び出す必要があります。エラーが発生した場合でも削除を保証するために、Swiftでdeferを使用してください。
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
作成から1時間後にもデータが必要になる可能性がある場合は、CachesまたはApplication Supportに保存してください。tmpは数分間の操作のために設計されており、保存用ではありません。
これらのルールに従うことで、一時ファイルが蓄積されず、ディスク容量が効率的に使用され、アプリがiOSファイルシステムのクリーンアップシナリオを正しく処理できるようになります。
よくある質問
通常、パスは1つのセッション内では変更されませんが、iOSはそれを保証しません。稀なケースでは、アプリがバックグラウンドからフォアグラウンドに移行する際にシステムがtmpを変更することがあります。そのためAppleは、パスを変数に保存するのではなく、パスが必要になるたびにNSTemporaryDirectory()を呼び出すことを推奨しています。
ファイルは蓄積され、ディスク容量を占有します。iOSはデバイスの再起動時にtmpを消去できますが、それまではアプリがディスク容量を無駄に消費します。大幅に蓄積されると、ユーザーはストレージ設定でアプリが多くの容量を占有していることを確認できます。
はい、機密データを含む一時ファイルにはNSFileProtectionCompleteを指定したDataProtectionTypeを使用できます。ただし、ファイルが現在のセッション内でのみ読み取られてから削除される場合、暗号化は過剰になる可能性があることに注意してください。データの種類に基づいて暗号化の必要性を評価してください。
一意の識別子を生成するにはProcessInfo.processInfo.globallyUniqueStringまたはUUID().uuidStringを使用します。FileManagerはtmp内で自動的に一意の名前を生成するurlForCreatingTemporaryFileメソッドも提供しています。これにより、並行書き込み時の衝突が防止されます。
間接的には — はい。Appleはアプリがディスクに保存するデータの総量に注目します。tmpに削除されていないギガバイトのファイルが含まれている場合、レビュアーはアプリを拒否する可能性があります。tmpの推奨制限は常に100 MB以下です。定期的にtmpをクリーンアップし、FileManagerを介してそのサイズを確認してください。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。