Sandbox — to izolowane środowisko wykonawcze aplikacji iOS, które ogranicza dostęp do systemu plików, sieci, zasobów sprzętowych i danych innych aplikacji. Każda aplikacja otrzymuje własne środowisko Sandbox podczas instalacji, a wszystkie jej operacje plikowe są automatycznie przekierowywane do tego izolowanego obszaru. Według Apple App Sandbox Design Guide (2026), architektura piaskownicy opiera się na trzech poziomach ochrony: izolacja systemu plików, kontrola komunikacji międzyprocesowej i podział zasobów sprzętowych z jawnym żądaniem uprawnień poprzez entitlements.
Najważniejsze
Sandbox — to system obowiązkowej kontroli dostępu (Mandatory Access Control), zaimplementowany na poziomie jądra iOS (XNU — kernel extension Sandbox.kext). Każda aplikacja podczas uruchamiania otrzymuje unikalny profil UUID Sandbox, który określa, do jakich zasobów systemowych aplikacja ma dostęp.
Architektura Sandbox obejmuje trzy kluczowe komponenty: File System Isolation (każda aplikacja widzi tylko swój kontener), Network Access Control (zapytania do sieci lokalnej mogą być ograniczone) i Inter-Process Communication (zakaz bezpośredniego IPC z innymi aplikacjami). Apple wprowadziła Sandbox w iOS 2.0 i od tego czasu znacznie zaostrzyła ograniczenia w każdej głównej wersji.
Sandbox nie jest opcjonalny — wszystkie aplikacje z App Store działają w piaskownicy. Deweloper nie może wyłączyć Sandbox ani ominąć jej ograniczeń. Próba dostępu do zabronionego zasobu kończy się błędem z kodem EPERM (Operation not permitted) i wpisem do dziennika systemowego.
import Foundation
// Próba dostępu do pliku innej aplikacji — zwraca nil
let otherAppPath = "/var/mobile/Containers/Data/Application/OTHER-UUID/Documents/file.txt"
let data = try? Data(contentsOf: URL(fileURLWithPath: otherAppPath))
// data == nil — Sandbox blokuje dostęp
// Poprawny dostęp — w obrębie własnego 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 każdej aplikacji na iOS zawiera kilka predefiniowanych katalogów, dostępnych przez API Foundation. Lokalizacja na nośniku fizycznym — /var/mobile/Containers/Data/Application/{UUID}/, ale deweloperzy nie powinni używać tej ścieżki bezpośrednio: zmienia się ona przy każdym ponownym uruchomieniu urządzenia w różnych wersjach iOS.
Główne katalogi Sandbox: Bundle (.app — tylko do odczytu, zawiera kod wykonywalny i zasoby), Documents (dane użytkownika, archiwizowane w iCloud), Library (Caches, Preferences, Application Support — z różnymi zasadami archiwizacji), tmp (pliki tymczasowe, usuwane przez system przy braku miejsca). Każdy katalog ma swój cykl życia i politykę przechowywania.
Fizyczną ścieżkę do Sandbox można uzyskać przez NSHomeDirectory() lub FileManager.url(for: .documentDirectory). Apple zaleca używanie URL-based API, ponieważ abstrahuje ono wewnętrzną strukturę systemu plików i pozostaje stabilne przy zmianach w macOS Sandbox na desktopie.
| Katalog Sandbox | Pobieranie przez FileManager | Uprawnienia |
|---|---|---|
| Documents | .documentDirectory | Odczyt i zapis |
| Bundle | Bundle.main.bundlePath | Tylko odczyt |
| Library | .libraryDirectory | Odczyt i zapis |
| tmp | NSTemporaryDirectory() | Odczyt i zapis |
| App Group | .containerURL(forSecurityApplicationGroupIdentifier:) | Odczyt i zapis |
Bezpośredni dostęp do systemu plików innych aplikacji w iOS jest całkowicie zablokowany. Nawet jeśli deweloper zna UUID kontenera innej aplikacji, Sandbox na poziomie jądra zwróci błąd przy próbie odczytu lub zapisu. To fundamentalna różnica między iOS a macOS, gdzie Sandbox jest bardziej elastyczny.
Apple udostępnia trzy legalne mechanizmy wymiany danych między aplikacjami: UIDocumentPickerViewController (użytkownik wybiera plik przez interfejs systemowy, aplikacja otrzymuje Security-Scoped URL), Share Extension (rozszerzenie do przesyłania danych do innej aplikacji) i App Groups (wspólny katalog dla aplikacji jednego dewelopera).
UIDocumentPicker — jedyny sposób uzyskania dostępu do plików z innych aplikacji bez wstępnej konfiguracji. Użytkownik jawnie wybiera plik przez standardowy systemowy picker, a iOS udostępnia aplikacji tymczasowy Security-Scoped URL. Dostęp działa do zamknięcia pickera lub do wywołania stopAccessingSecurityScopedResource.
Security-Scoped Bookmark — to mechanizm iOS, który umożliwia zachowanie dostępu do pliku poza Sandbox między uruchomieniami aplikacji. Gdy użytkownik wybiera plik przez UIDocumentPicker, aplikacja może utworzyć bookmark z Security-Scoped URL i zapisać go w UserDefaults lub innym magazynie.
Przy następnym uruchomieniu aplikacja przywraca dostęp przez URLByResolvingBookmarkData, który zwraca Security-Scoped URL. Następnie należy wywołać startAccessingSecurityScopedResource przed odczytem pliku i stopAccessingSecurityScopedResource po zakończeniu pracy. Równowaga wywołań jest obowiązkowa — każdy start musi mieć odpowiadający mu stop, w przeciwnym razie system wyczerpie limit zasobów Security-Scoped.
// Utwórz Security-Scoped Bookmark
func createBookmark(for url: URL) -> Data? {
return try? url.bookmarkData(
options: .minimalBookmark,
includingResourceValuesForKeys: nil,
relativeTo: nil
)
}
// Rozwiąż dane zakładki na URL
func resolveBookmark(data: Data) -> URL? {
var isStale = false
let url = try? URL.byResolvingBookmarkData(
data,
options: .withoutUI,
relativeTo: nil,
bookmarkDataIsStale: &isStale
)
if isStale {
// Zakładka jest nieaktualna, należy utworzyć nową
}
return url
}
Ważne ograniczenie: Security-Scoped Bookmarks nie działają dla plików wewnątrz własnego Sandbox — tylko dla plików uzyskanych przez UIDocumentPicker lub iCloud Drive. Bookmark zawiera dane Security-Scoped, które pozwalają systemowi zidentyfikować, która aplikacja i dla jakiego pliku żąda dostępu. Jeśli certyfikat aplikacji wygaśnie lub się zmieni, bookmark staje się nieważny.
App Groups — mechanizm iOS, który umożliwia kilku aplikacjom (i ich rozszerzeniom) od jednego dewelopera posiadanie wspólnego katalogu Sandbox. Aby włączyć, należy dodać Capability App Groups w Xcode i podać ten sam identyfikator grupy dla wszystkich docelowych aplikacji.
Wspólny katalog App Groups znajduje się poza Sandbox każdej pojedynczej aplikacji, ale wszystkie aplikacje w grupie mają do niego pełny dostęp do odczytu i zapisu. Umożliwia to wymianę plików, baz danych (Core Data z Store URL w App Group) i UserDefaults (przez initWithSuiteName) między główną aplikacją, Today Widget, Watch Extension i Share Extension.
Apple zaleca używanie App Groups do synchronizacji stanu między aplikacją a jej rozszerzeniami. Na przykład widget Today Widget może odczytywać dane ze wspólnego katalogu App Group, do którego główna aplikacja zapisuje aktualne dane. Przy tym każda aplikacja jest nadal izolowana od innych App Groups — tylko aplikacje z tym samym identyfikatorem grupy mają dostęp.
Sandbox w iOS nakłada szereg surowych ograniczeń, które należy uwzględnić podczas tworzenia aplikacji. Główne: zakaz kodu dynamicznego (ładowanie i wykonywanie kodu poza Sandbox), zakaz bezpośredniego dostępu do książki adresowej, kalendarza i zdjęć bez zgody użytkownika (Privacy framework) oraz ograniczenia dotyczące tworzenia procesów potomnych (fork, exec są zabronione).
Sieć: aplikacje mogą łączyć się z dowolnymi zdalnymi serwerami przez TCP/UDP, ale dostęp do localhost jest ograniczony — inne aplikacje nie mogą łączyć się z serwerem wewnątrz twojej aplikacji (z wyjątkiem kompilacji debugowych). Multicast i broadcast UDP są również blokowane dla aplikacji App Store.
Zasoby sprzętowe: dostęp do kamery, mikrofonu, geolokalizacji, Bluetooth i HealthKit wymaga jawnej zgody użytkownika przez dialog systemowy. Dla każdego typu zasobu iOS używa oddzielnego entitlement i klucza Info.plist z opisem powodu (NSPhotoLibraryUsageDescription, NSCameraUsageDescription). Żądanie uprawnienia bez opisu powodu w Info.plist prowadzi do zakończenia aplikacji.
Często zadawane pytania
Sandbox — izolowane środowisko wykonawcze aplikacji iOS, ograniczające dostęp do systemu plików, sieci i danych innych aplikacji. Każda aplikacja ma unikalny kontener Sandbox, do którego dostęp jest kontrolowany na poziomie jądra iOS przez Sandbox.kext.
Aplikacja ma dostęp do: Documents (dane użytkownika), Library (Caches, Preferences, Application Support), tmp (pliki tymczasowe) i Bundle (tylko odczyt). Katalog App Group jest dostępny dla aplikacji z tej samej grupy dewelopera.
Przez UIDocumentPickerViewController — użytkownik wybiera plik przez interfejs systemowy. iOS udostępnia Security-Scoped URL, dostępny do wywołania stopAccessingSecurityScopedResource. Alternatywą jest Share Extension do przesyłania danych między aplikacjami.
Security-Scoped Bookmark — to Data, która zachowuje dostęp do pliku poza Sandbox między uruchomieniami aplikacji. Tworzona jest z Security-Scoped URL (uzyskanego z UIDocumentPicker) przez bookmarkData. Przy następnym uruchomieniu bookmark jest przywracany przez URLByResolvingBookmarkData.
Nie, Sandbox nie można wyłączyć dla aplikacji z App Store. Na urządzeniach z jailbreakiem możliwe jest wyłączenie, ale jest to niezgodne z publikacją w App Store. Deweloperzy mogą testować bez Sandbox na symulatorze, ale prawdziwe urządzenia zawsze stosują Sandbox.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również