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-а), забрана директног приступа адресapу, календару и фотографијама без дозволе корисника (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. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође