Sandbox — co to jest, zasada izolacji i system plików

Autor: IT Sectr Opublikowano: 2026-07-09 Czas czytania: 10 min

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 — izolowany system plików i środowisko wykonawcze, unikalne dla każdej aplikacji iOS.
  • Każda aplikacja ma swój katalog Sandbox z podfolderami Documents, Library, tmp i Bundle.
  • Dostęp do innych aplikacji jest zabroniony: odczyt, zapis i wykonywanie kodu poza Sandbox są blokowane przez system.
  • Entitlements i Capabilities rozszerzają Sandbox: App Groups, iCloud, Security-Scoped Bookmarks wymagają jawnego zezwolenia.
  • UIDocumentPicker i Share Extension — jedyne sposoby wymiany plików między izolowanymi aplikacjami.

Co to jest Sandbox

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.

swift
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)

Struktura piaskownicy aplikacji

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 SandboxPobieranie przez FileManagerUprawnienia
Documents.documentDirectoryOdczyt i zapis
BundleBundle.main.bundlePathTylko odczyt
Library.libraryDirectoryOdczyt i zapis
tmpNSTemporaryDirectory()Odczyt i zapis
App Group.containerURL(forSecurityApplicationGroupIdentifier:)Odczyt i zapis

Dostęp do plików poza piaskownicą

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 Bookmarks

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.

swift
// 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.

Sandbox i App Groups

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.

Ograniczenia piaskownicy w iOS

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.

  • Kod dynamiczny — zabroniony: JavaScriptCore dla JS w WebView, ale nie dowolny kod maszynowy
  • Procesy potomne — fork, exec, system niedostępne z Sandbox
  • Dostęp do urządzeń — kamera, mikrofon, GPS wymagają dialogu systemowego
  • Sieć lokalna — multicast i broadcast UDP zablokowane dla App Store
  • Klucze szyfrowania — Keychain dostępny, ale tylko dla własnej aplikacji (kSecAttrAccessGroup dla App Group)

Często zadawane pytania

Co to jest Sandbox w iOS?

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.

Jakie pliki są dostępne w Sandbox aplikacji?

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.

Jak uzyskać dostęp do plików innej aplikacji?

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.

Co to jest Security-Scoped Bookmark?

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.

Czy można wyłączyć Sandbox w iOS?

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

  • Sandbox — fundamentalny system bezpieczeństwa iOS, izolujący każdą aplikację na poziomie jądra z Mandatory Access Control.
  • Struktura Sandbox obejmuje katalogi Documents, Library, tmp i Bundle z różnymi uprawnieniami i politykami archiwizacji.
  • Bezpośredni dostęp do systemu plików innych aplikacji jest całkowicie zablokowany — tylko UIDocumentPicker i App Groups są legalne.
  • Security-Scoped Bookmarks zapewniają trwały dostęp do plików poza Sandbox, uzyskanych przez interfejsy systemowe.
  • App Groups tworzą wspólną przestrzeń Sandbox dla zestawu aplikacji i rozszerzeń od jednego dewelopera.
  • Ograniczenia Sandbox obejmują zakaz kodu dynamicznego, procesów potomnych, sieci multicast oraz obowiązkowe dialogi systemowe dla zasobów sprzętowych.
  • Wszystkie aplikacje App Store działają w Sandbox — to nie opcjonalna, ale obowiązkowa cecha architektoniczna iOS.

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.

Omów projekt

Przeczytaj również