Temporary Directory — 概要、一時ファイル、ストレージ管理

著者: IT Sectr 公開日: 2026-07-10 読了時間: 10 分

Temporary Directory(tmp)は、iOSアプリのサンドボックス内にあるディレクトリで、現在のアプリセッション内でのみ必要な非常に短期間のデータを保存するためのものです。Apple File System Programming Guide(2024)によると、システムはアプリの終了時やデバイスの再起動時にtmpを消去する可能性があります。Caches Directoryとは異なり、tmp内の一時ファイルは起動間で永続化することを意図しておらず、開発者はディスク領域を無駄にしないために使用後に明示的に削除する必要があります。

重要ポイント

  • Temporary Directory — 現在のアプリセッションでのみ必要なデータのためのディレクトリ。
  • iOSはデバイスの再起動またはアプリ終了時にtmpを消去することがあります。
  • tmp内のファイルはiCloudおよびiTunesのバックアップに含まれません
  • tmpへのパスは、SwiftまたはObjective-CのNSTemporaryDirectory()を介して取得します。
  • 開発者は使用後にtmpからファイルを手動で削除する必要があります。

iOSのTemporary Directoryとは?

Temporary Directory(tmpとも呼ばれる)は、iOSアプリのサンドボックス内にあるディレクトリで、ライフタイムが現在のセッションに限定されたデータを保存するために設計されています。これはすべてのサンドボックスディレクトリの中で最も短期間のストレージです。

iOSは、中間ファイルストレージを必要とする操作のためにtmpを提供します:Documentsに移動する前のファイルのダウンロード、エクスポート前の一時コピーの作成、ストリーミングデータのバッファリング。操作が完了したら、一時ファイルを削除する必要があります。

Apple Developer Documentation(2024)によると、tmpディレクトリはそのパスがアプリの起動間で変更される可能性がある点でユニークです。iOSは起動ごとに新しいtmpパスを生成します — これにより、前のセッションのデータが誤って読み取られることを防ぎます。開発者は起動間でtmpパスを保存してはいけません。

重要な点:Caches Directoryではデータが複数の起動にわたって保持される可能性がありますが、tmpは長期的にセッション間でデータを保持しません。これは真に一時的なデータを保存する最も信頼性の高い方法です。

Temporary Directoryへのパスを取得する方法

Swiftでは、tmpへのパスを取得するためにグローバル関数NSTemporaryDirectory()またはFileManager.temporaryDirectoryを使用します。これらはすべてのサンドボックスディレクトリの中で最もシンプルなAPIです。

swift
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()を使用します。結果は、アプリの一時ディレクトリへの完全なパスを含む文字列です。

objective-c
@import Foundation;

NSString *tempDir = NSTemporaryDirectory();
NSString *tempFile = [tempDir stringByAppendingPathComponent:@"temp_data.bin"];

他のディレクトリとの主な違い:NSTemporaryDirectory()はドメインや検索マスクの指定を必要としません — これはグローバル関数です。ただし、次の起動時にパスが変更される可能性があるため、UserDefaultsやその他の永続ストレージに保存しないでください。

tmpに保存するデータ

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は近い将来にそれらを自動的に消去することを保証しません。

Temporary Directory vs Caches Directory

tmpCachesの比較は、開発者がストレージ用のディレクトリを選択する際に正しい決定を下すのに役立ちます。誤った選択は、早期のデータ損失または不必要な容量消費のいずれかにつながる可能性があります。

パラメータTemporary DirectoryCaches Directory
ライフタイム現在のセッションのみセッション間(保証なし)
パスの変更起動ごとに変更される可能性あり安定したパス
自動消去再起動時、オフロード時容量不足時
開発者による削除操作後に必須制限超過時に推奨
使用目的中間操作永続的キャッシュ

実用的なルール:作成後数秒または数分以内に削除されるデータにはtmpを選択します。セッション間で数時間または数日間保持することが有用だが再生成可能なデータにはCachesを選択します。

tmpのベストプラクティス

Temporary Directoryでの作業には規律が必要です:tmp内のデータは短期間であり、その蓄積は容量の無駄につながる可能性があるため、開発者はいくつかの重要なプラクティスに従う必要があります。

使用後は必ずファイルを削除する

FileManager.removeItem(at:)は、一時ファイルを使用した操作が完了したらすぐに呼び出す必要があります。エラーが発生した場合でも削除を保証するために、Swiftでdeferを使用してください。

swift
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

長期保存データにtmpを使用しない

作成から1時間後にもデータが必要になる可能性がある場合は、CachesまたはApplication Supportに保存してください。tmpは数分間の操作のために設計されており、保存用ではありません。

これらのルールに従うことで、一時ファイルが蓄積されず、ディスク容量が効率的に使用され、アプリがiOSファイルシステムのクリーンアップシナリオを正しく処理できるようになります。

よくある質問

アプリの実行中にTemporary Directoryへのパスが変更されることはありますか?

通常、パスは1つのセッション内では変更されませんが、iOSはそれを保証しません。稀なケースでは、アプリがバックグラウンドからフォアグラウンドに移行する際にシステムがtmpを変更することがあります。そのためAppleは、パスを変数に保存するのではなく、パスが必要になるたびにNSTemporaryDirectory()を呼び出すことを推奨しています。

tmpからファイルを削除しないとどうなりますか?

ファイルは蓄積され、ディスク容量を占有します。iOSはデバイスの再起動時にtmpを消去できますが、それまではアプリがディスク容量を無駄に消費します。大幅に蓄積されると、ユーザーはストレージ設定でアプリが多くの容量を占有していることを確認できます。

tmpは一時データの暗号化に適していますか?

はい、機密データを含む一時ファイルにはNSFileProtectionCompleteを指定したDataProtectionTypeを使用できます。ただし、ファイルが現在のセッション内でのみ読み取られてから削除される場合、暗号化は過剰になる可能性があることに注意してください。データの種類に基づいて暗号化の必要性を評価してください。

tmpで衝突なしに一意のファイル名を作成するには?

一意の識別子を生成するにはProcessInfo.processInfo.globallyUniqueStringまたはUUID().uuidStringを使用します。FileManagerはtmp内で自動的に一意の名前を生成するurlForCreatingTemporaryFileメソッドも提供しています。これにより、並行書き込み時の衝突が防止されます。

tmpのサイズはApp Storeのレビューに影響しますか?

間接的には — はい。Appleはアプリがディスクに保存するデータの総量に注目します。tmpに削除されていないギガバイトのファイルが含まれている場合、レビュアーはアプリを拒否する可能性があります。tmpの推奨制限は常に100 MB以下です。定期的にtmpをクリーンアップし、FileManagerを介してそのサイズを確認してください。

まとめ

  • Temporary Directory(tmp) — ライフタイムが現在のアプリセッションに限定されたデータのためのディレクトリ。
  • tmpへのパスは起動間で変更される可能性があります — 永続ストレージに保存しないでください。
  • システムはデバイスの再起動またはアプリのオフロード時にtmpを消去できます。
  • tmp内のファイルはiCloudおよびiTunesのバックアップに含まれません
  • Caches Directoryとは異なり、tmpはセッション間の保存用ではありません。
  • 開発者はFileManager.removeItemを使用して一時ファイルを明示的に削除する必要があります。
  • 操作の結果に関係なく一時ファイルの削除を保証するために、Swiftでdeferを使用してください。

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください