Sandbox — какво е това, принцип на изолация и файлова система

Автор: IT Sectr Публикувано: 2026-07-09 Време за четене: 10 мин

Sandbox — изолирана среда за изпълнение на iOS приложение, която ограничава достъпа до файловата система, мрежата, хардуерните ресурси и данните на други приложения. Всяко приложение получава собствена Sandbox среда при инсталиране и всички негови файлови операции автоматично се пренасочват към тази изолирана област. Според Apple App Sandbox Design Guide (2026), архитектурата на пясъчника се основава на три нива на защита: изолация на файловата система, контрол на междупроцесната комуникация и разделяне на хардуерните ресурси с изрично искане на разрешения чрез entitlements.

Основни точки

  • Sandbox — изолирана файлова система и среда за изпълнение, уникална за всяко iOS приложение.
  • Всяко приложение има своя Sandbox директория с подпапки Documents, Library, tmp и Bundle.
  • Достъп до други приложения е забранен: четене, запис и изпълнение на код извън Sandbox се блокират от системата.
  • Entitlements и Capabilities разширяват Sandbox: App Groups, iCloud, Security-Scoped Bookmarks изискват изрично разрешение.
  • UIDocumentPicker и Share Extension — единствените начини за обмен на файлове между изолирани приложения.

Какво е Sandbox

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) и запис в системния дневник.

swift
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Четене и запис
BundleBundle.main.bundlePathСамо четене
Library.libraryDirectoryЧетене и запис
tmpNSTemporaryDirectory()Четене и запис
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 Bookmarks

Security-Scoped Bookmark — механизъм в iOS, който позволява запазване на достъпа до файл извън Sandbox между стартиранията на приложението. Когато потребителят избере файл чрез UIDocumentPicker, приложението може да създаде bookmark от Security-Scoped URL и да го запази в UserDefaults или друго хранилище.

При следващото стартиране приложението възстановява достъпа чрез URLByResolvingBookmarkData, която връща Security-Scoped URL. След това трябва да се извика startAccessingSecurityScopedResource преди четене на файла и stopAccessingSecurityScopedResource след приключване на работата. Балансът на извикванията е задължителен — всеки start трябва да има съответстващ stop, в противен случай системата ще изчерпи лимита на Security-Scoped ресурси.

swift
// Създаване на 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 става невалиден.

Sandbox и App Groups

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 — само приложения с еднакъв идентификатор на група имат достъп.

Ограничения на пясъчника в iOS

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 води до прекратяване на приложението.

  • Динамичен код — забранен: JavaScriptCore за JS в WebView, но не произволен машинен код
  • Дъщерни процеси — fork, exec, system не са достъпни от Sandbox
  • Достъп до устройства — камера, микрофон, GPS изискват системен диалог
  • Локална мрежа — multicast и broadcast UDP блокирани за App Store
  • Ключове за криптиране — Keychain достъпен, но само за собственото приложение (kSecAttrAccessGroup за App Group)

Често задавани въпроси

Какво е Sandbox в iOS?

Sandbox — изолирана среда за изпълнение на iOS приложение, която ограничава достъпа до файловата система, мрежата и данните на други приложения. Всяко приложение има уникален Sandbox контейнер, чийто достъп се контролира на ниво ядро на iOS чрез Sandbox.kext.

Кои файлове са достъпни в Sandbox на приложението?

Приложението има достъп до: Documents (потребителски данни), Library (Caches, Preferences, Application Support), tmp (временни файлове) и Bundle (само четене). App Group директорията е достъпна за приложения от една и съща група разработчици.

Как да получим достъп до файловете на друго приложение?

Чрез UIDocumentPickerViewController — потребителят избира файл чрез системния интерфейс. iOS предоставя Security-Scoped URL, достъпен до извикване на stopAccessingSecurityScopedResource. Алтернатива — Share Extension за прехвърляне на данни между приложения.

Какво е Security-Scoped Bookmark?

Security-Scoped Bookmark — данни, които запазват достъпа до файл извън Sandbox между стартиранията на приложението. Създава се от Security-Scoped URL (получен от UIDocumentPicker) чрез bookmarkData. При следващото стартиране bookmark се възстановява чрез URLByResolvingBookmarkData.

Може ли да се деактивира Sandbox в iOS?

Не, Sandbox не може да се деактивира за приложения от App Store. На jailbreak устройства е възможно деактивиране, но това е несъвместимо с публикуване в App Store. Разработчиците могат да тестват без Sandbox на симулатор, но реалните устройства винаги прилагат Sandbox.

Обобщение

  • Sandbox — фундаменталната система за сигурност на iOS, която изолира всяко приложение на ниво ядро с Mandatory Access Control.
  • Структура на Sandbox включва директориите Documents, Library, tmp и Bundle с различни права за достъп и политики за архивиране.
  • Директен достъп до файловата система на други приложения е напълно блокиран — само UIDocumentPicker и App Groups са легитимни.
  • Security-Scoped Bookmarks осигуряват персистентен достъп до файлове извън Sandbox, получени чрез системни интерфейси.
  • App Groups създават споделено Sandbox пространство за набор от приложения и разширения от един и същ разработчик.
  • Ограничения на Sandbox включват забрана на динамичен код, дъщерни процеси, multicast мрежа и задължителни системни диалози за хардуерни ресурси.
  • Всички App Store приложения работят в Sandbox — това не е опционална, а задължителна архитектурна характеристика на iOS.

Ще разработим мобилно приложение под ключ

IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.

Обсъдете проекта

Прочетете също