Application Supportは、iOSアプリのサンドボックス内にあるディレクトリで、アプリの動作に必要な補助データを保存するために設計されていますが、ユーザーが直接作成するものではありません。Apple File System Basics(2024)によると、このディレクトリは設定ファイル、Core DataのSQLiteデータベース、キャッシュされたドキュメント、アプリが自ら生成するその他のデータに最適です。Documents Directoryとは異なり、Application SupportはiTunes File Sharingに表示されず、ユーザーは直接アクセスできないため、サービスデータが誤って削除されるのを防ぎます。
重要ポイント
Application Supportは、iOSアプリのサンドボックス内にあるディレクトリで、アプリが自身の動作のために作成・使用するデータを保存するために設計されていますが、ユーザードキュメントではありません。設定、データベース、キャッシュされたメタデータ、その他の補助ファイルの主要な場所です。
iOSはApplication Supportを、Documents(ユーザーデータ)とCaches(一時データ)の間の中間層として指定しています。Application Support内のファイルは比較的永続的ですが、ユーザーは直接アクセスできないようにする必要があります — これがDocuments Directoryとの違いです。
Apple Developer Documentation(2024)によると、Application Supportは、Core DataのSQLiteデータベース、Realmファイル、JSON/plist形式の設定、ダウンロードした参考資料、アプリが使用するがユーザーが明示的に作成していないその他のデータを保存するための推奨場所です。
重要:デフォルトでは、Application SupportはiCloudおよびiTunesのバックアップに含まれます。アプリがこのディレクトリに再作成可能な大量のデータ(ダウンロードしたガイドなど)を保存する場合は、関連ファイルにisExcludedFromBackupフラグを設定する必要があります。
Swiftでは、Application Support DirectoryへのパスはFileManager.urls(for: .applicationSupportDirectory)を介して取得します。Appleはデータ分離のため、Application Support内にアプリ名のサブディレクトリを作成することを推奨しています。
import Foundation
let fileManager = FileManager.default
guard let appSupportURL = fileManager.urls(
for: .applicationSupportDirectory,
in: .userDomainMask
).first else { return }
// Create app subdirectory
let bundleID = Bundle.main.bundleIdentifier ?? "com.example.app"
let appDir = appSupportURL.appendingPathComponent(bundleID)
try fileManager.createDirectory(
at: appDir,
withIntermediateDirectories: true
)
Objective-Cは、NSApplicationSupportDirectoryを指定してNSSearchPathForDirectoriesInDomainsを使用します。Swiftと同様に、アプリ名の子ディレクトリを作成することをお勧めします。
@import Foundation;
NSArray *paths = NSSearchPathForDirectoriesInDomains(
NSApplicationSupportDirectory,
NSUserDomainMask,
YES
);
NSString *appSupportPath = paths.firstObject;
NSString *appDir = [appSupportPath stringByAppendingPathComponent:@"com.example.app"];
初回起動時、Application Supportディレクトリは存在しない場合があります — createDirectory(at:withIntermediateDirectories:)を使用して作成する必要があります。これが、システムが自動的に作成するDocuments Directoryとの違いです。
Application Supportは、アプリが動作のために使用する幅広いデータに適しています。このディレクトリに適切なデータを選択することで、ファイルシステムの整理が向上し、バックアップが簡単になります。
Core DataのSQLiteファイルはデフォルトでApplication Supportに作成されます。Realmもデータベースをこのディレクトリに配置することを推奨しています。これにより、ユーザードキュメントがアプリの内部データベースから分離されます。
アプリ設定、Feature Flags、キャッシュされたユーザーメタデータ(認証トークンは除く — それらにはKeychainを使用)を含むJSON、plist、XMLファイル。
| データタイプ | Application Support | 代替 |
|---|---|---|
| SQLite Core Data | はい(デフォルト) | — |
| 設定 .plist / .json | はい | UserDefaults(単純なもの用) |
| ダウンロードした参考資料 | はい | Documents(ユーザー向けの場合) |
| アプリログ | 条件付き | Caches(ログ用) |
| 認証トークン | いいえ | Keychain |
選択基準:データがアプリによって作成・使用され、ユーザーによるものではなく、起動間で永続化する必要がある場合 — Application Supportが適切な場所です。
Core DataはApplication Supportの主要な利用者の1つです。NSPersistentContainerを作成すると、Core Dataは自動的にSQLiteファイルをLibrary/Application Supportに、モデル名に基づく一意の名前で配置します。
Core Dataがファイルをどこに保存するかを理解することは、マイグレーション、バックアップ、デバッグにとって重要です。主なファイル:.sqlite(データ)、.sqlite-wal(Write-Ahead Log)、.sqlite-shm(Shared Memory)。
import CoreData
// Create Core Data container
let container = NSPersistentContainer(name: "MyAppModel")
// Custom store URL directory
guard let appSupportURL = FileManager.default
.urls(for: .applicationSupportDirectory,
in: .userDomainMask).first else { return }
let storeURL = appSupportURL
.appendingPathComponent("MyAppModel.sqlite")
let description = NSPersistentStoreDescription(url: storeURL)
container.persistentStoreDescriptions = [description]
CloudKit Core Data同期を使用する場合、SQLiteファイルはApplication Supportに残り、CloudKitはトランスポート層として機能します。この場合、ファイルをバックアップから除外しないことが重要です — そうしないと、デバイス間の同期が壊れる可能性があります。
Application SupportとDocumentsの違いは、iOSアプリのファイル構造を適切に整理する上で最も重要なものの1つです。誤った選択をすると、ユーザーが重要なアプリデータを誤って削除したり、逆にファイルを見つけられなくなったりする可能性があります。
| パラメータ | Application Support | Documents Directory |
|---|---|---|
| ユーザーアクセス | なし(非表示) | iTunes File Sharing経由 |
| データタイプ | アプリサービスデータ | ユーザードキュメント |
| iCloudバックアップ | はい(デフォルト) | はい(デフォルト) |
| 削除リスク | 低い(アクセス不可) | 中程度(ユーザーがアクセス可能) |
| 例 | SQLite Core Data | エクスポートされたPDF |
シンプルなルール:ユーザーがファイルを表示し、削除できる必要がある場合 — Documentsを使用。ファイルがアプリの動作に必要だが、ユーザーが知る必要がない場合 — Application Supportを使用。データを再作成できる場合 — Cachesを使用。
Application Supportを扱うには、他のサンドボックスディレクトリと区別するいくつかの特性を考慮する必要があります。これらのプラクティスに従うことで、データ損失、マイグレーションの問題、予期しないアプリの動作を回避できます。
Documentsとは異なり、Application Supportは初回起動時に存在しない場合があります。withIntermediateDirectories: trueパラメータを指定してcreateDirectory(at:withIntermediateDirectories:)を使用し、サブディレクトリのチェーン全体が作成されることを保証します。
Application Support内にBundle Identifierのサブディレクトリを作成します。これにより、アプリのデータが他のアプリのデータから分離され(サンドボックスがすでに分離を提供していますが)、プロバイダー変更時のマイグレーションが簡素化されます。
import Foundation
enum AppSupport {
static func ensureDirectory() throws -> URL {
let fm = FileManager.default
let baseURL = try fm.url(
for: .applicationSupportDirectory,
in: .userDomainMask,
appropriateFor: nil,
create: true
)
let appDir = baseURL
.appendingPathComponent(Bundle.main.bundleIdentifier ?? "default")
try fm.createDirectory(at: appDir, withIntermediateDirectories: true)
return appDir
}
}
これらのプラクティスに従うことで、アプリのサービスデータが適切に整理され、ユーザーによる誤った削除から保護され、バックアップから正しく復元されることが保証されます。
よくある質問
はい、Application Supportはアプリインストール時に自動的に作成されません。システムが初回起動時に作成するDocumentsやCachesとは異なり、Application Supportは開発者がFileManager.createDirectory(at:withIntermediateDirectories:)を使用して作成する必要があります。これは通常、application(_:didFinishLaunchingWithOptions:)メソッドで行われます。
いいえ、標準のiOSインターフェース(Files、iTunes)を介してユーザーはApplication Supportにアクセスできません。ただし、アプリ自体が削除されると、Application Supportを含むサンドボックス全体が完全に削除されます。iCloudバックアップは、復元または手動削除まで保持されます。
ユーザー向けのダウンロード動画には、ユーザーがFilesを介してファイルを管理できるように、Documents Directoryを使用することをお勧めします。動画がアプリの内部キャッシュの一部(オフライントレーニングコンテンツなど)である場合は、大きなファイルに対してisExcludedFromBackupフラグを設定してApplication Supportを使用できます。
Application Support内にサブディレクトリのバージョニングを追加します。更新時に現在のデータバージョンを確認し、必要に応じて新しいサブディレクトリを作成し、古いものはロールバック用に保持します。すべてのユーザーが新しいデータバージョンに正常に移行したことを確認してから、古いディレクトリを削除します。
間接的に — はい。Application Supportに数万の小さなファイルがある場合、FileManager.enumeratorが初期化を遅くする可能性があります。Application Support内のファイル数を制限(1000以下)し、構造化データには多数の個別ファイルではなくデータベース(Core Data、Realm)を使用することをお勧めします。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。