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 містить кілька визначених директорій, доступних через API Foundation. Розташування на фізичному носії — /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 Groups директорії, куди головний застосунок записує актуальні дані. При цьому кожен застосунок усе ще ізольований від інших App Groups — лише застосунки з однаковим ідентифікатором групи мають доступ.
Sandbox в iOS накладає низку суворих обмежень, які необхідно враховувати під час розробки. Основні: заборона на динамічний код (завантаження та виконання коду поза Sandbox), заборона на прямий доступ до адресної книги, календаря та фотографій без дозволу користувача (Privacy framework), та обмеження на створення дочірніх процесів (fork, exec заборонені).
Мережа: застосунки можуть підключатися до будь-яких віддалених серверів через TCP/UDP, але доступ до localhost обмежений — інші застосунки не можуть підключатися до сервера всередині вашого застосунку (крім налагоджувальних збірок). 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 — це Data, що зберігає доступ до файлу поза Sandbox між запусками застосунку. Створюється з Security-Scoped URL (отриманого з UIDocumentPicker) через bookmarkData. При наступному запуску bookmark відновлюється через URLByResolvingBookmarkData.
Ні, Sandbox не можна вимкнути для застосунків з App Store. На джейлбрейк-пристроях можливе вимкнення, але це несумісно з публікацією в App Store. Розробники можуть тестувати без Sandbox на симуляторі, але реальні пристрої завжди застосовують Sandbox.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також