Application Support là một thư mục trong sandbox của ứng dụng iOS được thiết kế để lưu trữ dữ liệu phụ trợ cần thiết cho hoạt động của ứng dụng, nhưng không được người dùng tạo trực tiếp. Theo Apple File System Basics (2024), thư mục này là tối ưu cho các tệp cấu hình, cơ sở dữ liệu SQLite của Core Data, tài liệu được lưu trong bộ nhớ đệm và các dữ liệu khác mà ứng dụng tự tạo ra. Không giống như Thư mục Documents, Application Support không xuất hiện trong iTunes File Sharing và người dùng không có quyền truy cập trực tiếp vào nó, điều này bảo vệ dữ liệu dịch vụ khỏi bị xóa vô tình.
Điểm chính
Application Support là một thư mục trong sandbox của ứng dụng iOS được thiết kế để lưu trữ dữ liệu mà ứng dụng tạo và sử dụng cho công việc của nó, nhưng không phải là tài liệu người dùng. Đây là vị trí chính cho các cấu hình, cơ sở dữ liệu, siêu dữ liệu được lưu trong bộ nhớ đệm và các tệp phụ trợ khác.
iOS chỉ định Application Support như một lớp trung gian giữa Documents (dữ liệu người dùng) và Caches (dữ liệu tạm thời). Các tệp trong Application Support có thể tương đối cố định, nhưng người dùng không nên có quyền truy cập trực tiếp vào chúng — điều này phân biệt nó với Thư mục Documents.
Theo Tài liệu dành cho nhà phát triển Apple (2024), Application Support là vị trí được khuyến nghị để lưu trữ cơ sở dữ liệu SQLite của Core Data, tệp Realm, cấu hình ở định dạng JSON/plist, tài liệu tham khảo đã tải xuống và các dữ liệu khác mà ứng dụng sử dụng nhưng người dùng không tạo ra một cách rõ ràng.
Quan trọng: theo mặc định, Application Support được bao gồm trong bản sao lưu iCloud và iTunes. Nếu ứng dụng lưu trữ lượng lớn dữ liệu trong thư mục này có thể được tạo lại (ví dụ: hướng dẫn đã tải xuống), bạn phải đặt cờ isExcludedFromBackup cho các tệp liên quan.
Trong Swift, đường dẫn đến Thư mục Application Support được lấy qua FileManager.urls(for: .applicationSupportDirectory). Apple khuyến nghị tạo một thư mục con với tên ứng dụng bên trong Application Support để cách ly dữ liệu.
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 sử dụng NSSearchPathForDirectoriesInDomains với NSApplicationSupportDirectory. Giống như Swift, nên tạo một thư mục con với tên ứng dụng.
@import Foundation;
NSArray *paths = NSSearchPathForDirectoriesInDomains(
NSApplicationSupportDirectory,
NSUserDomainMask,
YES
);
NSString *appSupportPath = paths.firstObject;
NSString *appDir = [appSupportPath stringByAppendingPathComponent:@"com.example.app"];
Khi khởi chạy lần đầu, thư mục Application Support có thể chưa tồn tại — nó phải được tạo bằng createDirectory(at:withIntermediateDirectories:). Điều này phân biệt nó với Thư mục Documents, được hệ thống tạo tự động.
Application Support phù hợp với nhiều loại dữ liệu mà ứng dụng sử dụng cho công việc của nó. Chọn đúng dữ liệu cho thư mục này cải thiện tổ chức hệ thống tệp và đơn giản hóa việc sao lưu.
Các tệp SQLite của Core Data được tạo trong Application Support theo mặc định. Realm cũng khuyến nghị đặt cơ sở dữ liệu trong thư mục này. Điều này cách ly tài liệu người dùng khỏi cơ sở dữ liệu nội bộ của ứng dụng.
Các tệp JSON, plist, XML với cài đặt ứng dụng, Feature Flags, siêu dữ liệu người dùng được lưu trong bộ nhớ đệm (nhưng không phải mã thông báo xác thực — hãy sử dụng Keychain cho chúng).
| Loại dữ liệu | Application Support | Thay thế |
|---|---|---|
| SQLite Core Data | Có (mặc định) | — |
| Cấu hình .plist / .json | Có | UserDefaults (cho đơn giản) |
| Tài liệu tham khảo đã tải xuống | Có | Documents (nếu cho người dùng) |
| Nhật ký ứng dụng | Có điều kiện | Caches (cho nhật ký) |
| Mã thông báo xác thực | Không | Keychain |
Tiêu chí lựa chọn: nếu dữ liệu được tạo và sử dụng bởi ứng dụng, không phải người dùng, và nên tồn tại giữa các lần khởi chạy — vị trí của nó là trong Application Support.
Core Data là một trong những người tiêu thụ chính của Application Support. Khi tạo NSPersistentContainer, Core Data tự động đặt các tệp SQLite trong Library/Application Support với tên duy nhất dựa trên tên mô hình.
Hiểu nơi Core Data lưu trữ tệp là rất quan trọng cho di chuyển (migrations), sao lưu và gỡ lỗi. Các tệp chính: .sqlite (dữ liệu), .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]
Khi sử dụng đồng bộ Core Data với CloudKit, tệp SQLite vẫn nằm trong Application Support và CloudKit hoạt động như một lớp vận chuyển. Trong trường hợp này, điều quan trọng là không loại trừ tệp khỏi bản sao lưu — nếu không, đồng bộ hóa giữa các thiết bị có thể bị gián đoạn.
Sự khác biệt giữa Application Support và Documents là một trong những điểm quan trọng nhất để tổ chức đúng cấu trúc tệp của ứng dụng iOS. Lựa chọn sai có thể dẫn đến việc người dùng vô tình xóa dữ liệu quan trọng của ứng dụng hoặc ngược lại, không thể tìm thấy tệp của họ.
| Tham số | Application Support | Thư mục Documents |
|---|---|---|
| Quyền truy cập người dùng | Không (ẩn) | Qua iTunes File Sharing |
| Loại dữ liệu | Dữ liệu dịch vụ ứng dụng | Tài liệu người dùng |
| Sao lưu iCloud | Có (mặc định) | Có (mặc định) |
| Rủi ro xóa | Thấp (không có quyền truy cập) | Trung bình (người dùng có thể truy cập) |
| Ví dụ | SQLite Core Data | PDF đã xuất |
Quy tắc đơn giản: nếu người dùng nên nhìn thấy tệp và có thể xóa nó — sử dụng Documents. Nếu tệp cần thiết cho ứng dụng hoạt động nhưng người dùng không cần biết về nó — sử dụng Application Support. Nếu dữ liệu có thể được tạo lại — sử dụng Caches.
Làm việc với Application Support đòi hỏi phải xem xét một số đặc điểm phân biệt nó với các thư mục sandbox khác. Tuân theo các phương pháp này giúp tránh mất dữ liệu, sự cố di chuyển và hành vi ứng dụng không mong muốn.
Không giống như Documents, Application Support có thể không tồn tại khi khởi chạy lần đầu. Sử dụng createDirectory(at:withIntermediateDirectories:) với tham số withIntermediateDirectories: true để đảm bảo tạo toàn bộ chuỗi thư mục con.
Tạo một thư mục con với Bundle Identifier bên trong Application Support. Điều này cách ly dữ liệu ứng dụng của bạn khỏi các ứng dụng khác (mặc dù sandbox đã cung cấp sự cách ly) và đơn giản hóa việc di chuyển khi thay đổi nhà cung cấp.
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
}
}
Tuân theo các phương pháp này đảm bảo rằng dữ liệu dịch vụ của ứng dụng được tổ chức đúng cách, được bảo vệ khỏi sự xóa vô tình của người dùng và được khôi phục chính xác từ các bản sao lưu.
Câu hỏi thường gặp
Có, Application Support không được tạo tự động khi cài đặt ứng dụng. Không giống như Documents và Caches, được hệ thống tạo khi khởi chạy lần đầu, Application Support phải được nhà phát triển tạo bằng FileManager.createDirectory(at:withIntermediateDirectories:). Việc này thường được thực hiện trong phương thức application(_:didFinishLaunchingWithOptions:).
Không, thông qua giao diện iOS tiêu chuẩn (Files, iTunes), người dùng không có quyền truy cập vào Application Support. Tuy nhiên, khi bản thân ứng dụng bị xóa, toàn bộ sandbox, bao gồm Application Support, sẽ bị xóa hoàn toàn. Bản sao lưu iCloud vẫn tồn tại cho đến khi khôi phục hoặc xóa thủ công.
Đối với video đã tải xuống dành cho người dùng, tốt hơn nên sử dụng Thư mục Documents để người dùng có thể quản lý các tệp này qua Files. Nếu video là một phần của bộ nhớ đệm nội bộ của ứng dụng (ví dụ: nội dung đào tạo ngoại tuyến), có thể sử dụng Application Support với cờ isExcludedFromBackup cho các tệp lớn.
Thêm phiên bản (versioning) cho các thư mục con bên trong Application Support. Khi cập nhật, hãy kiểm tra phiên bản dữ liệu hiện tại và tạo thư mục con mới nếu cần, giữ lại thư mục cũ để khôi phục. Chỉ xóa thư mục cũ sau khi xác nhận rằng tất cả người dùng đã di chuyển thành công sang phiên bản dữ liệu mới.
Gián tiếp — có. Nếu Application Support chứa hàng chục nghìn tệp nhỏ, FileManager.enumerator có thể làm chậm quá trình khởi tạo. Nên giới hạn số lượng tệp trong Application Support (không quá 1000) và sử dụng cơ sở dữ liệu (Core Data, Realm) thay vì nhiều tệp riêng lẻ cho dữ liệu có cấu trúc.
Tổng kết
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm