Sandbox — изолирана среда за изпълнение на iOS приложение, която ограничава достъпа до файловата система, мрежата, хардуерните ресурси и данните на други приложения. Всяко приложение получава собствена Sandbox среда при инсталиране и всички негови файлови операции автоматично се пренасочват към тази изолирана област. Според Apple App Sandbox Design Guide (2026), архитектурата на пясъчника се основава на три нива на защита: изолация на файловата система, контрол на междупроцесната комуникация и разделяне на хардуерните ресурси с изрично искане на разрешения чрез entitlements.
Основни точки
Sandbox — система за задължителен контрол на достъпа (Mandatory Access Control), имплементирана на ниво ядро на iOS (XNU — kernel extension Sandbox.kext). Всяко приложение при стартиране получава уникален UUID Sandbox профил, който определя до кои системни ресурси е разрешен достъп.
Архитектурата на Sandbox включва три ключови компонента: File System Isolation (всяко приложение вижда само своя контейнер), Network Access Control (заявките към локалната мрежа могат да бъдат ограничени) и Inter-Process Communication (забрана за директен IPC с други приложения). Apple въведе Sandbox в iOS 2.0 и оттогава значително затегна ограниченията във всяка основна версия.
Sandbox не е опционален — всички приложения от App Store работят в пясъчник. Разработчикът не може да деактивира Sandbox или да заобиколи неговите ограничения. Опитът за достъп до забранен ресурс завършва с грешка с код EPERM (Operation not permitted) и запис в системния дневник.
import Foundation
// Опит за достъп до файл на друго приложение — връща nil
let otherAppPath = "/var/mobile/Containers/Data/Application/OTHER-UUID/Documents/file.txt"
let data = try? Data(contentsOf: URL(fileURLWithPath: otherAppPath))
// data == nil — Sandbox блокира достъпа
// Коректен достъп — в рамките на собствения Sandbox
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 на всяко iOS приложение съдържа няколко предварително дефинирани директории, достъпни чрез Foundation API. Местоположението на физическия носител — /var/mobile/Containers/Data/Application/{UUID}/, но разработчиците не трябва да използват този път директно: той се променя при всяко рестартиране на устройството в различните версии на iOS.
Основните Sandbox директории: Bundle (.app — само за четене, съдържа изпълним код и ресурси), Documents (потребителски данни, архивират се в iCloud), Library (Caches, Preferences, Application Support — с различни правила за архивиране), tmp (временни файлове, изтриват се от системата при липса на място). Всяка директория има свой жизнен цикъл и политика за съхранение.
Физическият път до Sandbox може да се получи чрез NSHomeDirectory() или FileManager.url(for: .documentDirectory). Apple препоръчва използването на URL-based API, тъй като абстрахира вътрешната структура на файловата система и остава стабилен при промени в macOS Sandbox на десктоп.
| Sandbox директория | Получаване чрез FileManager | Разрешения |
|---|---|---|
| Documents | .documentDirectory | Четене и запис |
| Bundle | Bundle.main.bundlePath | Само четене |
| Library | .libraryDirectory | Четене и запис |
| tmp | NSTemporaryDirectory() | Четене и запис |
| App Group | .containerURL(forSecurityApplicationGroupIdentifier:) | Четене и запис |
Директен достъп до файловата система на други приложения в iOS е напълно блокиран. Дори ако разработчикът знае UUID на контейнера на друго приложение, Sandbox на ниво ядро ще върне грешка при опит за четене или запис. Това е фундаменталната разлика между iOS и macOS, където Sandbox е по-гъвкав.
Apple предоставя три легитимни механизма за обмен на данни между приложения: UIDocumentPickerViewController (потребителят избира файл чрез системния интерфейс, приложението получава Security-Scoped URL), Share Extension (разширение за прехвърляне на данни към друго приложение) и App Groups (споделена директория за приложения на един и същ разработчик).
UIDocumentPicker — единственият начин за достъп до файлове от други приложения без предварителна конфигурация. Потребителят изрично избира файл чрез стандартния системен избирач и iOS предоставя на приложението временен Security-Scoped URL. Достъпът е валиден до затваряне на избирача или до извикване на stopAccessingSecurityScopedResource.
Security-Scoped Bookmark — механизъм в iOS, който позволява запазване на достъпа до файл извън Sandbox между стартиранията на приложението. Когато потребителят избере файл чрез UIDocumentPicker, приложението може да създаде bookmark от Security-Scoped URL и да го запази в UserDefaults или друго хранилище.
При следващото стартиране приложението възстановява достъпа чрез URLByResolvingBookmarkData, която връща Security-Scoped URL. След това трябва да се извика startAccessingSecurityScopedResource преди четене на файла и stopAccessingSecurityScopedResource след приключване на работата. Балансът на извикванията е задължителен — всеки start трябва да има съответстващ stop, в противен случай системата ще изчерпи лимита на Security-Scoped ресурси.
// Създаване на Security-Scoped Bookmark
func createBookmark(for url: URL) -> Data? {
return try? url.bookmarkData(
options: .minimalBookmark,
includingResourceValuesForKeys: nil,
relativeTo: nil
)
}
// Разрешаване на bookmark данни към URL
func resolveBookmark(data: Data) -> URL? {
var isStale = false
let url = try? URL.byResolvingBookmarkData(
data,
options: .withoutUI,
relativeTo: nil,
bookmarkDataIsStale: &isStale
)
if isStale {
// Bookmark е остарял, трябва да се създаде нов
}
return url
}
Важно ограничение: Security-Scoped Bookmarks не работят за файлове в собствения Sandbox — само за файлове, получени чрез UIDocumentPicker или iCloud Drive. Bookmark съдържа Security-Scoped данни, които позволяват на системата да идентифицира кое приложение и за кой файл иска достъп. Ако сертификатът на приложението изтече или се промени, bookmark става невалиден.
App Groups — механизъм в iOS, който позволява на няколко приложения (и техните разширения) от един и същ разработчик да имат споделена Sandbox директория. За активиране трябва да се добави Capability App Groups в Xcode и да се посочи същият идентификатор на група за всички целеви приложения.
Споделената App Groups директория се намира извън Sandbox на всяко отделно приложение, но всички приложения в групата имат пълен достъп до нея за четене и запис. Това позволява обмен на файлове, бази данни (Core Data с Store URL в App Group) и UserDefaults (чрез initWithSuiteName) между основното приложение, Today Widget, Watch Extension и Share Extension.
Apple препоръчва използването на App Groups за синхронизиране на състоянието между приложението и неговите разширения. Например, Today Widget може да чете данни от споделената App Group директория, където основното приложение записва актуални данни. Всяко приложение обаче остава изолирано от други App Groups — само приложения с еднакъв идентификатор на група имат достъп.
Sandbox в iOS налага редица строги ограничения, които трябва да се вземат предвид при разработката. Основните: забрана на динамичен код (зареждане и изпълнение на код извън Sandbox), забрана на директен достъп до адресната книга, календара и снимките без разрешение на потребителя (Privacy framework) и ограничения за създаване на дъщерни процеси (fork, exec са забранени).
Мрежа: приложенията могат да се свързват с всякакви отдалечени сървъри чрез TCP/UDP, но достъпът до localhost е ограничен — други приложения не могат да се свържат със сървъра във вашето приложение (освен debug сборки). Multicast и broadcast UDP също се блокират за App Store приложения.
Хардуерни ресурси: достъпът до камера, микрофон, геолокация, Bluetooth и HealthKit изисква изрично разрешение от потребителя чрез системен диалог. За всеки тип ресурс iOS използва отделен entitlement и Info.plist ключ с описание на причината (NSPhotoLibraryUsageDescription, NSCameraUsageDescription). Искане на разрешение без описание на причината в Info.plist води до прекратяване на приложението.
Често задавани въпроси
Sandbox — изолирана среда за изпълнение на iOS приложение, която ограничава достъпа до файловата система, мрежата и данните на други приложения. Всяко приложение има уникален Sandbox контейнер, чийто достъп се контролира на ниво ядро на iOS чрез Sandbox.kext.
Приложението има достъп до: Documents (потребителски данни), Library (Caches, Preferences, Application Support), tmp (временни файлове) и Bundle (само четене). App Group директорията е достъпна за приложения от една и съща група разработчици.
Чрез UIDocumentPickerViewController — потребителят избира файл чрез системния интерфейс. iOS предоставя Security-Scoped URL, достъпен до извикване на stopAccessingSecurityScopedResource. Алтернатива — Share Extension за прехвърляне на данни между приложения.
Security-Scoped Bookmark — данни, които запазват достъпа до файл извън Sandbox между стартиранията на приложението. Създава се от Security-Scoped URL (получен от UIDocumentPicker) чрез bookmarkData. При следващото стартиране bookmark се възстановява чрез URLByResolvingBookmarkData.
Не, Sandbox не може да се деактивира за приложения от App Store. На jailbreak устройства е възможно деактивиране, но това е несъвместимо с публикуване в App Store. Разработчиците могат да тестват без Sandbox на симулатор, но реалните устройства винаги прилагат Sandbox.
Обобщение
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също