Sandbox là môi trường chạy bị cô lập cho các ứng dụng iOS, giới hạn quyền truy cập vào hệ thống tệp, mạng, tài nguyên phần cứng và dữ liệu của các ứng dụng khác. Mỗi ứng dụng nhận được môi trường Sandbox riêng khi cài đặt, và mọi thao tác tệp của nó được tự động chuyển hướng vào khu vực bị cô lập này. Theo Apple App Sandbox Design Guide (2026), kiến trúc hộp cát dựa trên ba mức bảo vệ: cô lập hệ thống tệp, kiểm soát giao tiếp giữa các tiến trình và phân tách tài nguyên phần cứng với yêu cầu cấp quyền rõ ràng thông qua entitlements.
Điểm chính
Sandbox là hệ thống kiểm soát truy cập bắt buộc (Mandatory Access Control) được triển khai ở cấp nhân iOS (XNU — tiện ích mở rộng nhân Sandbox.kext). Mỗi ứng dụng nhận một hồ sơ Sandbox UUID duy nhất khi khởi chạy, hồ sơ này xác định ứng dụng được phép truy cập những tài nguyên nào.
Kiến trúc Sandbox gồm ba thành phần chính: File System Isolation (mỗi ứng dụng chỉ thấy container của mình), Network Access Control (các yêu cầu đến mạng cục bộ có thể bị hạn chế) và Inter-Process Communication (cấm IPC trực tiếp với các ứng dụng khác). Apple giới thiệu Sandbox trong iOS 2.0 và kể từ đó đã tăng cường đáng kể các hạn chế ở mỗi phiên bản lớn.
Sandbox không phải là tùy chọn — tất cả ứng dụng từ App Store đều chạy trong hộp cát. Nhà phát triển không thể tắt Sandbox hoặc vượt qua các hạn chế của nó. Nỗ lực truy cập tài nguyên bị cấm sẽ kết thúc bằng mã lỗi EPERM (Operation not permitted) và một mục ghi trong nhật ký hệ thống.
import Foundation
// Nỗ lực truy cập tệp của ứng dụng khác — trả về nil
let otherAppPath = "/var/mobile/Containers/Data/Application/OTHER-UUID/Documents/file.txt"
let data = try? Data(contentsOf: URL(fileURLWithPath: otherAppPath))
// data == nil — Sandbox chặn quyền truy cập
// Truy cập chính xác — trong Sandbox của chính mình
let fileManager = FileManager.default
guard let documentsURL = fileManager.urls(
for: .documentDirectory,
in: .userDomainMask
).first else { return }
let myFileURL = documentsURL.appendingPathComponent("notes.txt")
try "Hello, Sandbox!".write(to: myFileURL, atomically: true, encoding: .utf8)
Sandbox của mỗi ứng dụng trên iOS chứa một số thư mục được xác định trước có thể truy cập qua API Foundation. Vị trí trên phương tiện vật lý là /var/mobile/Containers/Data/Application/{UUID}/, nhưng nhà phát triển không nên dùng trực tiếp đường dẫn này: nó thay đổi sau mỗi lần khởi động lại thiết bị trong các phiên bản iOS khác nhau.
Các thư mục chính của Sandbox: Bundle (.app — chỉ đọc, chứa mã thực thi và tài nguyên), Documents (dữ liệu người dùng, được sao lưu vào iCloud), Library (Caches, Preferences, Application Support — với các quy tắc sao lưu khác nhau), tmp (tệp tạm thời, bị hệ thống xóa khi thiếu dung lượng). Mỗi thư mục có vòng đời và chính sách lưu trữ riêng.
Đường dẫn vật lý của Sandbox có thể lấy qua NSHomeDirectory() hoặc FileManager.url(for: .documentDirectory). Apple khuyên dùng API dựa trên URL, vì nó trừu tượng hóa cấu trúc bên trong của hệ thống tệp và vẫn ổn định khi Sandbox macOS thay đổi trên máy tính để bàn.
| Thư mục Sandbox | Lấy qua FileManager | Quyền |
|---|---|---|
| Documents | .documentDirectory | Đọc và ghi |
| Bundle | Bundle.main.bundlePath | Chỉ đọc |
| Library | .libraryDirectory | Đọc và ghi |
| tmp | NSTemporaryDirectory() | Đọc và ghi |
| App Group | .containerURL(forSecurityApplicationGroupIdentifier:) | Đọc và ghi |
Truy cập trực tiếp vào hệ thống tệp của các ứng dụng khác trong iOS hoàn toàn bị chặn. Ngay cả khi nhà phát triển biết UUID container của ứng dụng khác, Sandbox ở cấp nhân vẫn trả về lỗi khi cố đọc hoặc ghi. Đây là khác biệt cơ bản giữa iOS và macOS, nơi Sandbox linh hoạt hơn.
Apple cung cấp ba cơ chế hợp pháp để trao đổi dữ liệu giữa các ứng dụng: UIDocumentPickerViewController (người dùng chọn tệp qua giao diện hệ thống, ứng dụng nhận URL Security-Scoped), Share Extension (tiện ích mở rộng để chuyển dữ liệu sang ứng dụng khác) và App Groups (thư mục dùng chung cho các ứng dụng của cùng một nhà phát triển).
UIDocumentPicker là cách duy nhất để truy cập tệp của ứng dụng khác mà không cần thiết lập trước. Người dùng chọn tệp một cách rõ ràng qua bộ chọn hệ thống tiêu chuẩn, và iOS cung cấp cho ứng dụng URL Security-Scoped tạm thời. Quyền truy cập có hiệu lực cho đến khi đóng bộ chọn hoặc cho đến khi gọi stopAccessingSecurityScopedResource.
Security-Scoped Bookmark là cơ chế iOS cho phép duy trì quyền truy cập vào một tệp bên ngoài Sandbox giữa các lần khởi chạy ứng dụng. Khi người dùng chọn tệp qua UIDocumentPicker, ứng dụng có thể tạo bookmark từ URL Security-Scoped và lưu nó vào UserDefaults hoặc một nơi lưu trữ khác.
Ở lần khởi chạy tiếp theo, ứng dụng khôi phục quyền truy cập qua URLByResolvingBookmarkData, hàm trả về URL Security-Scoped. Sau đó cần gọi startAccessingSecurityScopedResource trước khi đọc tệp và stopAccessingSecurityScopedResource sau khi hoàn tất. Cân bằng lời gọi là bắt buộc — mỗi start phải có một stop tương ứng, nếu không hệ thống sẽ cạn kiệt giới hạn tài nguyên Security-Scoped.
// Tạo Security-Scoped Bookmark
func createBookmark(for url: URL) -> Data? {
return try? url.bookmarkData(
options: .minimalBookmark,
includingResourceValuesForKeys: nil,
relativeTo: nil
)
}
// Giải dữ liệu bookmark thành URL
func resolveBookmark(data: Data) -> URL? {
var isStale = false
let url = try? URL.byResolvingBookmarkData(
data,
options: .withoutUI,
relativeTo: nil,
bookmarkDataIsStale: &isStale
)
if isStale {
// Bookmark đã cũ, cần tạo mới
}
return url
}
Giới hạn quan trọng: Security-Scoped Bookmarks không hoạt động cho các tệp bên trong Sandbox của chính bạn — chỉ dành cho tệp lấy qua UIDocumentPicker hoặc iCloud Drive. Bookmark chứa dữ liệu Security-Scoped giúp hệ thống xác định ứng dụng nào đang yêu cầu quyền truy cập vào tệp nào. Nếu chứng chỉ của ứng dụng hết hạn hoặc thay đổi, bookmark trở nên không hợp lệ.
App Groups là cơ chế iOS cho phép nhiều ứng dụng (và tiện ích mở rộng của chúng) của cùng một nhà phát triển chia sẻ một thư mục Sandbox chung. Để kích hoạt, cần thêm Capability App Groups trong Xcode và chỉ định cùng một mã nhận dạng nhóm cho tất cả ứng dụng mục tiêu.
Thư mục App Groups dùng chung nằm bên ngoài Sandbox của từng ứng dụng riêng lẻ, nhưng tất cả ứng dụng trong nhóm có quyền truy cập đầy đủ để đọc và ghi. Điều này cho phép trao đổi tệp, cơ sở dữ liệu (Core Data với Store URL trong App Group) và UserDefaults (qua initWithSuiteName) giữa ứng dụng chính, Today Widget, Watch Extension và Share Extension.
Apple khuyên dùng App Groups để đồng bộ hóa trạng thái giữa ứng dụng và các tiện ích mở rộng. Ví dụ, widget Today Widget có thể đọc dữ liệu từ thư mục App Groups dùng chung, nơi ứng dụng chính ghi dữ liệu mới nhất. Đồng thời, mỗi ứng dụng vẫn bị cô lập khỏi các App Groups khác — chỉ những ứng dụng có cùng mã nhận dạng nhóm mới có quyền truy cập.
Sandbox trong iOS áp đặt một loạt hạn chế nghiêm ngặt cần cân nhắc khi phát triển. Chính yếu: cấm mã động (tải và thực thi mã bên ngoài Sandbox), cấm truy cập trực tiếp vào sổ địa chỉ, lịch và ảnh khi chưa được người dùng cho phép (Privacy framework), và hạn chế tạo tiến trình con (fork và exec bị cấm).
Mạng: ứng dụng có thể kết nối với mọi máy chủ từ xa qua TCP/UDP, nhưng truy cập vào localhost bị hạn chế — các ứng dụng khác không thể kết nối với máy chủ bên trong ứng dụng của bạn (trừ bản gỡ lỗi). UDP multicast và broadcast cũng bị chặn đối với ứng dụng App Store.
Tài nguyên phần cứng: truy cập camera, micro, định vị GPS, Bluetooth và HealthKit yêu cầu cấp phép rõ ràng của người dùng qua hộp thoại hệ thống. Với mỗi loại tài nguyên, iOS sử dụng một entitlement riêng và một khóa Info.plist có mô tả lý do (NSPhotoLibraryUsageDescription, NSCameraUsageDescription). Yêu cầu cấp phép mà không có mô tả lý do trong Info.plist sẽ khiến ứng dụng bị thoát.
Câu hỏi thường gặp
Sandbox là môi trường chạy bị cô lập cho các ứng dụng iOS, giới hạn quyền truy cập vào hệ thống tệp, mạng và dữ liệu của các ứng dụng khác. Mỗi ứng dụng có một container Sandbox duy nhất, quyền truy cập được kiểm soát ở cấp nhân iOS qua Sandbox.kext.
Ứng dụng có thể truy cập: Documents (dữ liệu người dùng), Library (Caches, Preferences, Application Support), tmp (tệp tạm thời) và Bundle (chỉ đọc). Thư mục App Group khả dụng cho các ứng dụng thuộc cùng nhóm nhà phát triển.
Qua UIDocumentPickerViewController — người dùng chọn tệp bằng giao diện hệ thống. iOS cung cấp URL Security-Scoped, có hiệu lực cho đến khi gọi stopAccessingSecurityScopedResource. Giải pháp thay thế là Share Extension để chuyển dữ liệu giữa các ứng dụng.
Security-Scoped Bookmark là Data duy trì quyền truy cập vào một tệp bên ngoài Sandbox giữa các lần khởi chạy ứng dụng. Nó được tạo từ URL Security-Scoped (lấy từ UIDocumentPicker) qua bookmarkData. Ở lần khởi chạy tiếp theo, bookmark được khôi phục qua URLByResolvingBookmarkData.
Không, không thể tắt Sandbox đối với ứng dụng App Store. Trên thiết bị jailbreak có thể tắt, nhưng điều này không tương thích với việc phát hành trên App Store. Nhà phát triển có thể kiểm thử không có Sandbox trên trình mô phỏng, nhưng thiết bị thật luôn áp dụng Sandbox.
Tóm tắ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