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-а), забрана директног приступа адресapу, календару и фотографијама без дозволе корисника (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-у, али не произвољни maшински код
  • Процеси потомци — 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 са различитим дозволама приступа и политикама бекапа.
  • Директан приступ систему датотека других апликација je потпуно блокиран — само UIDocumentPicker и App Groups су легитимни.
  • Security-Scoped Bookmarks обезбеђују перзистентан приступ датотекама ван Sandbox-а, добијеним преко системских интерфејса.
  • App Groups стварају заједнички Sandbox простор за скуп апликација и екстензија од истог програмера.
  • Ограничења Sandbox-а укључују забрану динамичког кода, процеса потомака, multicast мреже и обавезне системске дијалоге за хардверске ресурсе.
  • Све App Store апликације раде у Sandbox-у — то није опциона, већ обавезна архитектонска карактеристика iOS-а.

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође