Sandbox — что это такое, принцип изоляции и файловая система

Автор: IT Sectr Опубликовано: 2026-07-09 Время чтения: 10 мин

Sandbox — это изолированная среда выполнения iOS-приложения, которая ограничивает доступ к файловой системе, сети, аппаратным ресурсам и данным других приложений. Каждое приложение получает собственное Sandbox-окружение при установке, и все его файловые операции автоматически перенаправляются в эту изолированную область. По данным Apple App Sandbox Design Guide (2026), архитектура песочницы основана на трёх уровнях защиты: изоляция файловой системы, контроль межпроцессного взаимодействия и разделение аппаратных ресурсов с явным запросом прав через entitlements.

Главное

  • Sandbox — изолированная файловая система и среда выполнения, уникальная для каждого iOS-приложения.
  • Каждое приложение имеет свою Sandbox-директорию с подпапками Documents, Library, tmp и Bundle.
  • Доступ к другим приложениям запрещён: чтение, запись и исполнение кода вне Sandbox блокируются системой.
  • Entitlements и Capabilities расширяют Sandbox: App Groups, iCloud, Security-Scoped Bookmarks требуют явного разрешения.
  • UIDocumentPicker и Share Extension — единственные способы обмена файлами между изолированными приложениями.

Что такое Sandbox

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) и записью в системный журнал.

swift
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Чтение и запись
BundleBundle.main.bundlePathТолько чтение
Library.libraryDirectoryЧтение и запись
tmpNSTemporaryDirectory()Чтение и запись
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 Bookmarks

Security-Scoped Bookmark — это механизм iOS, позволяющий сохранить доступ к файлу за пределами Sandbox между запусками приложения. Когда пользователь выбирает файл через UIDocumentPicker, приложение может создать bookmark из Security-Scoped URL и сохранить его в UserDefaults или другом хранилище.

При следующем запуске приложение восстанавливает доступ через URLByResolvingBookmarkData, который возвращает Security-Scoped URL. Затем необходимо вызвать startAccessingSecurityScopedResource перед чтением файла и stopAccessingSecurityScopedResource после завершения работы. Баланс вызовов обязателен — каждый start должен иметь соответствующий stop, иначе система исчерпает лимит Security-Scoped ресурсов.

swift
// 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 становится недействительным.

Sandbox и App Groups

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 — только приложения с одинаковым идентификатором группы имеют доступ.

Ограничения песочницы в iOS

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 приводит к завершению приложения.

  • Динамический код — запрещён: JavaScriptCore для JS в WebView, но не произвольный машинный код
  • Дочерние процессы — fork, exec, system недоступны из Sandbox
  • Доступ к устройствам — камера, микрофон, GPS требуют системного диалога
  • Локальная сеть — multicast и broadcast UDP заблокированы для App Store
  • Ключи шифрования — Keychain доступен, но только для своего приложения (kSecAttrAccessGroup для App Group)

Часто задаваемые вопросы

Что такое Sandbox в iOS?

Sandbox — изолированная среда выполнения iOS-приложения, ограничивающая доступ к файловой системе, сети и данным других приложений. Каждое приложение имеет уникальный Sandbox-контейнер, доступ к которому контролируется на уровне ядра iOS через Sandbox.kext.

Какие файлы доступны в Sandbox приложения?

Приложению доступны: Documents (пользовательские данные), Library (Caches, Preferences, Application Support), tmp (временные файлы) и Bundle (только чтение). App Group директория доступна для приложений одной группы разработчика.

Как получить доступ к файлам другого приложения?

Через UIDocumentPickerViewController — пользователь выбирает файл через системный интерфейс. iOS предоставляет Security-Scoped URL, доступный до вызова stopAccessingSecurityScopedResource. Альтернатива — Share Extension для передачи данных между приложениями.

Что такое Security-Scoped Bookmark?

Security-Scoped Bookmark — это Data, сохраняющая доступ к файлу вне Sandbox между запусками приложения. Создаётся из Security-Scoped URL (полученного из UIDocumentPicker) через bookmarkData. При следующем запуске bookmark восстанавливается через URLByResolvingBookmarkData.

Можно ли отключить Sandbox в iOS?

Нет, Sandbox нельзя отключить для приложений из App Store. На джейлбрейк-устройствах возможно отключение, но это несовместимо с публикацией в App Store. Разработчики могут тестировать без Sandbox на симуляторе, но реальные устройства всегда применяют Sandbox.

Итоги

  • Sandbox — фундаментальная система безопасности iOS, изолирующая каждое приложение на уровне ядра с Mandatory Access Control.
  • Структура Sandbox включает Documents, Library, tmp и Bundle директории с различными правами доступа и политиками бэкапа.
  • Прямой доступ к файловой системе других приложений полностью заблокирован — только UIDocumentPicker и App Groups легитимны.
  • Security-Scoped Bookmarks обеспечивают персистентный доступ к файлам вне Sandbox, полученным через системные интерфейсы.
  • App Groups создают общее Sandbox-пространство для набора приложений и расширений от одного разработчика.
  • Ограничения Sandbox включают запрет на динамический код, дочерние процессы, multicast-сеть и обязательные системные диалоги для аппаратных ресурсов.
  • Все App Store приложения работают в Sandbox — это не опциональная, а обязательная архитектурная особенность iOS.

Мы разработаем мобильное приложение под ключ

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

Читайте также