Sandbox — este un mediu de execuție izolat al aplicației iOS care limitează accesul la sistemul de fișiere, rețea, resurse hardware și datele altor aplicații. Fiecare aplicație primește propriul mediu Sandbox la instalare, iar toate operațiunile sale cu fișiere sunt redirecționate automat în această zonă izolată. Conform Apple App Sandbox Design Guide (2026), arhitectura sandbox-ului se bazează pe trei niveluri de protecție: izolarea sistemului de fișiere, controlul comunicării inter-proces și partajarea resurselor hardware cu solicitarea explicită a permisiunilor prin entitlements.
Principalele puncte
Sandbox — este un sistem de control obligatoriu al accesului (Mandatory Access Control), implementat la nivelul nucleului iOS (XNU — kernel extension Sandbox.kext). Fiecare aplicație la pornire primește un profil UUID Sandbox unic, care determină la ce resurse sistemice are acces permis.
Arhitectura Sandbox include trei componente cheie: File System Isolation (fiecare aplicație vede doar propriul container), Network Access Control (solicitările către rețeaua locală pot fi limitate) și Inter-Process Communication (interzicerea IPC direct cu alte aplicații). Apple a introdus Sandbox în iOS 2.0 și de atunci a înăsprit semnificativ restricțiile în fiecare versiune majoră.
Sandbox nu este opțional — toate aplicațiile din App Store rulează în sandbox. Dezvoltatorul nu poate dezactiva Sandbox-ul sau ocoli restricțiile sale. Încercarea de a accesa o resursă interzisă se termină cu eroarea cod EPERM (Operation not permitted) și o înregistrare în jurnalul de sistem.
import Foundation
// Încercare de acces la fișierul altei aplicații — returnează nil
let otherAppPath = "/var/mobile/Containers/Data/Application/OTHER-UUID/Documents/file.txt"
let data = try? Data(contentsOf: URL(fileURLWithPath: otherAppPath))
// data == nil — Sandbox blochează accesul
// Acces corect — în propriul 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-ul fiecărei aplicații pe iOS conține mai multe directoare predefinite, accesibile prin API Foundation. Locația pe suportul fizic — /var/mobile/Containers/Data/Application/{UUID}/, dar dezvoltatorii nu ar trebui să utilizeze această cale direct: ea se schimbă la fiecare repornire a dispozitivului în diferite versiuni iOS.
Directoarele principale Sandbox: Bundle (.app — doar citire, conține cod executabil și resurse), Documents (date utilizator, se face backup în iCloud), Library (Caches, Preferences, Application Support — cu reguli diferite de backup), tmp (fișiere temporare, șterse de sistem la lipsă de spațiu). Fiecare director are propriul ciclu de viață și politica de stocare.
Calea fizică către Sandbox poate fi obținută prin NSHomeDirectory() sau FileManager.url(for: .documentDirectory). Apple recomandă utilizarea API-ului URL-based, deoarece abstractizează structura internă a sistemului de fișiere și rămâne stabil la modificările din macOS Sandbox pe desktop.
| Director Sandbox | Obținere prin FileManager | Permisiuni |
|---|---|---|
| Documents | .documentDirectory | Citire și scriere |
| Bundle | Bundle.main.bundlePath | Doar citire |
| Library | .libraryDirectory | Citire și scriere |
| tmp | NSTemporaryDirectory() | Citire și scriere |
| App Group | .containerURL(forSecurityApplicationGroupIdentifier:) | Citire și scriere |
Accesul direct la sistemul de fișiere al altor aplicații în iOS este complet blocat. Chiar dacă dezvoltatorul cunoaște UUID-ul containerului altei aplicații, Sandbox-ul la nivel de nucleu va returna o eroare la încercarea de citire sau scriere. Aceasta este diferența fundamentală între iOS și macOS, unde Sandbox-ul este mai flexibil.
Apple oferă trei mecanisme legitime pentru schimbul de date între aplicații: UIDocumentPickerViewController (utilizatorul selectează fișierul prin interfața de sistem, aplicația primește un URL Security-Scoped), Share Extension (extensie pentru transmiterea datelor către altă aplicație) și App Groups (director comun pentru aplicațiile aceluiași dezvoltator).
UIDocumentPicker — singurul mod de a obține acces la fișierele din alte aplicații fără configurare prealabilă. Utilizatorul selectează explicit fișierul prin selectorul standard de sistem, iar iOS oferă aplicației un URL Security-Scoped temporar. Accesul este valabil până la închiderea selectorului sau până la apelarea stopAccessingSecurityScopedResource.
Security-Scoped Bookmark — este un mecanism iOS care permite păstrarea accesului la un fișier din afara Sandbox-ului între pornirile aplicației. Când utilizatorul selectează un fișier prin UIDocumentPicker, aplicația poate crea un bookmark din URL-ul Security-Scoped și îl poate salva în UserDefaults sau altă stocare.
La următoarea pornire, aplicația restaurează accesul prin URLByResolvingBookmarkData, care returnează un URL Security-Scoped. Apoi trebuie apelat startAccessingSecurityScopedResource înainte de citirea fișierului și stopAccessingSecurityScopedResource după terminarea lucrului. Echilibrul apelurilor este obligatoriu — fiecare start trebuie să aibă un stop corespunzător, altfel sistemul va epuiza limita resurselor Security-Scoped.
// Creează Security-Scoped Bookmark
func createBookmark(for url: URL) -> Data? {
return try? url.bookmarkData(
options: .minimalBookmark,
includingResourceValuesForKeys: nil,
relativeTo: nil
)
}
// Rezolvă datele bookmark-ului în URL
func resolveBookmark(data: Data) -> URL? {
var isStale = false
let url = try? URL.byResolvingBookmarkData(
data,
options: .withoutUI,
relativeTo: nil,
bookmarkDataIsStale: &isStale
)
if isStale {
// Bookmark-ul este învechit, trebuie creat unul nou
}
return url
}
Limitare importantă: Security-Scoped Bookmarks nu funcționează pentru fișierele din interiorul propriului Sandbox — doar pentru fișierele obținute prin UIDocumentPicker sau iCloud Drive. Bookmark-ul conține date Security-Scoped care permit sistemului să identifice ce aplicație și pentru ce fișier solicită acces. Dacă certificatul aplicației expiră sau se modifică, bookmark-ul devine invalid.
App Groups — mecanism iOS care permite mai multor aplicații (și extensiilor lor) de la același dezvoltator să aibă un director Sandbox comun. Pentru activare, trebuie adăugată Capability App Groups în Xcode și specificat același identificator de grup pentru toate aplicațiile țintă.
Directorul comun App Groups se află în afara Sandbox-ului fiecărei aplicații individuale, dar toate aplicațiile din grup au acces complet de citire și scriere la el. Aceasta permite schimbul de fișiere, baze de date (Core Data cu Store URL în App Group) și UserDefaults (prin initWithSuiteName) între aplicația principală, Today Widget, Watch Extension și Share Extension.
Apple recomandă utilizarea App Groups pentru sincronizarea stării între aplicație și extensiile sale. De exemplu, widget-ul Today Widget poate citi date din directorul comun App Group, în care aplicația principală scrie date actualizate. Cu toate acestea, fiecare aplicație este în continuare izolată de alte App Groups — doar aplicațiile cu același identificator de grup au acces.
Sandbox-ul în iOS impune o serie de restricții stricte care trebuie luate în considerare în dezvoltare. Principalele: interzicerea codului dinamic (încărcarea și executarea codului în afara Sandbox-ului), interzicerea accesului direct la agenda de adrese, calendar și fotografii fără permisiunea utilizatorului (Privacy framework) și limitări la crearea proceselor copil (fork, exec sunt interzise).
Rețea: aplicațiile se pot conecta la orice servere remote prin TCP/UDP, dar accesul la localhost este limitat — alte aplicații nu se pot conecta la serverul din interiorul aplicației dvs. (cu excepția compilărilor de debug). Multicast și broadcast UDP sunt, de asemenea, blocate pentru aplicațiile App Store.
Resurse hardware: accesul la cameră, microfon, geolocație, Bluetooth și HealthKit necesită permisiunea explicită a utilizatorului printr-un dialog de sistem. Pentru fiecare tip de resursă, iOS folosește un entitlement separat și o cheie Info.plist cu descrierea motivului (NSPhotoLibraryUsageDescription, NSCameraUsageDescription). Solicitarea permisiunii fără descrierea motivului în Info.plist duce la terminarea aplicației.
Întrebări frecvente
Sandbox — un mediu de execuție izolat al aplicației iOS, care limitează accesul la sistemul de fișiere, rețea și datele altor aplicații. Fiecare aplicație are un container Sandbox unic, al cărui acces este controlat la nivelul nucleului iOS prin Sandbox.kext.
Aplicația are acces la: Documents (date utilizator), Library (Caches, Preferences, Application Support), tmp (fișiere temporare) și Bundle (doar citire). Directorul App Group este disponibil pentru aplicațiile aceluiași grup de dezvoltator.
Prin UIDocumentPickerViewController — utilizatorul selectează fișierul prin interfața de sistem. iOS oferă un URL Security-Scoped, accesibil până la apelarea stopAccessingSecurityScopedResource. Alternativa — Share Extension pentru transmiterea datelor între aplicații.
Security-Scoped Bookmark — sunt Date care păstrează accesul la un fișier din afara Sandbox-ului între pornirile aplicației. Se creează dintr-un URL Security-Scoped (obținut din UIDocumentPicker) prin bookmarkData. La următoarea pornire, bookmark-ul este restaurat prin URLByResolvingBookmarkData.
Nu, Sandbox-ul nu poate fi dezactivat pentru aplicațiile din App Store. Pe dispozitivele jailbreak este posibilă dezactivarea, dar aceasta este incompatibilă cu publicarea în App Store. Dezvoltatorii pot testa fără Sandbox pe simulator, dar dispozitivele reale aplică întotdeauna Sandbox-ul.
Rezumat
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și