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 مستقیم با سایر برنامهها). اپل 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) دریافت کرد. اپل استفاده از URL-based API را توصیه میکند زیرا ساختار داخلی سیستم فایل را انتزاع میکند و با تغییرات Sandbox در macOS روی دسکتاپ پایدار میماند.
| دایرکتوری Sandbox | دریافت از طریق FileManager | مجوزها |
|---|---|---|
| Documents | .documentDirectory | خواندن و نوشتن |
| Bundle | Bundle.main.bundlePath | فقط خواندن |
| Library | .libraryDirectory | خواندن و نوشتن |
| tmp | NSTemporaryDirectory() | خواندن و نوشتن |
| App Group | .containerURL(forSecurityApplicationGroupIdentifier:) | خواندن و نوشتن |
دسترسی مستقیم به سیستم فایل سایر برنامهها در iOS کاملاً مسدود شده است. حتی اگر توسعهدهنده UUID کانتینر برنامه دیگری را بداند، Sandbox در سطح هسته هنگام تلاش برای خواندن یا نوشتن خطا برمیگرداند. این تفاوت اساسی بین iOS و macOS است که در آن Sandbox انعطافپذیرتر است.
اپل سه مکانیسم قانونی برای تبادل داده بین برنامهها ارائه میدهد: UIDocumentPickerViewController (کاربر فایل را از طریق رابط سیستم انتخاب میکند، برنامه URL امنیتی-دامنهدار دریافت میکند)، Share Extension (افزونه برای انتقال داده به برنامه دیگر) و App Groups (دایرکتوری مشترک برای برنامههای یک توسعهدهنده).
UIDocumentPicker — تنها راه دسترسی به فایلهای سایر برنامهها بدون پیکربندی قبلی. کاربر به صراحت فایل را از طریق انتخابگر استاندارد سیستم انتخاب میکند و iOS یک URL امنیتی-دامنهدار موقت در اختیار برنامه قرار میدهد. دسترسی تا بسته شدن انتخابگر یا تا فراخوانی stopAccessingSecurityScopedResource معتبر است.
Security-Scoped Bookmark — مکانیزمی در iOS است که امکان حفظ دسترسی به فایل خارج از Sandbox را بین راهاندازیهای برنامه فراهم میکند. هنگامی که کاربر فایلی را از طریق UIDocumentPicker انتخاب میکند، برنامه میتواند از URL امنیتی-دامنهدار یک bookmark ایجاد کرده و آن را در UserDefaults یا ذخیرهساز دیگری نگهداری کند.
در راهاندازی بعدی، برنامه دسترسی را از طریق URLByResolvingBookmarkData بازیابی میکند که یک URL امنیتی-دامنهدار برمیگرداند. سپس باید قبل از خواندن فایل، startAccessingSecurityScopedResource و پس از اتمام کار، stopAccessingSecurityScopedResource فراخوانی شود. تعادل فراخوانیها الزامی است — هر start باید stop متناظر داشته باشد، در غیر این صورت سیستم محدودیت منابع امنیتی-دامنهدار را تمام میکند.
// ایجاد 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 حاوی دادههای امنیتی-دامنهداری است که به سیستم امکان میدهد تشخیص دهد کدام برنامه و برای کدام فایل درخواست دسترسی میکند. اگر گواهی برنامه منقضی شود یا تغییر کند، 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 را فراهم میکند.
اپل استفاده از 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 یک URL امنیتی-دامنهدار ارائه میدهد که تا فراخوانی stopAccessingSecurityScopedResource در دسترس است. جایگزین — Share Extension برای انتقال داده بین برنامهها.
Security-Scoped Bookmark — دادهای است که دسترسی به فایل خارج از Sandbox را بین راهاندازیهای برنامه حفظ میکند. از URL امنیتی-دامنهدار (دریافت شده از UIDocumentPicker) از طریق bookmarkData ایجاد میشود. در راهاندازی بعدی، bookmark از طریق URLByResolvingBookmarkData بازیابی میشود.
خیر، Sandbox را نمیتوان غیرفعال کرد برای برنامههای App Store. در دستگاههای jailbreak امکان غیرفعالسازی وجود دارد، اما این با انتشار در App Store سازگار نیست. توسعهدهندگان میتوانند بدون Sandbox روی شبیهساز تست کنند، اما دستگاههای واقعی همیشه از Sandbox استفاده میکنند.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید