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
// Attempt access to another app file — returns nil
let otherAppPath = "/var/mobile/Containers/Data/Application/OTHER-UUID/Documents/file.txt"
let data = try? Data(contentsOf: URL(fileURLWithPath: otherAppPath))
// data == nil — Sandbox blocks access
// Correct access — within own 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 ресурсов.
// Create Security-Scoped Bookmark
func createBookmark(for url: URL) -> Data? {
return try? url.bookmarkData(
options: .minimalBookmark,
includingResourceValuesForKeys: nil,
relativeTo: nil
)
}
// Resolve bookmark data to URL
func resolveBookmark(data: Data) -> URL? {
var isStale = false
let url = try? URL.byResolvingBookmarkData(
data,
options: .withoutUI,
relativeTo: nil,
bookmarkDataIsStale: &isStale
)
if isStale {
// Bookmark is stale, need to create new
}
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), запрет на прямой доступ к адресной книге, календарю и фотографиям без разрешения пользователя (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 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также