Sandbox هو بيئة تشغيل معزولة لتطبيقات iOS تحد من الوصول إلى نظام الملفات والشبكة وموارد الأجهزة وبيانات التطبيقات الأخرى. يحصل كل تطبيق على بيئة Sandbox خاصة به عند التثبيت، وتُعاد توجيه جميع عملياته على الملفات تلقائيًا إلى هذه المنطقة المعزولة. وفقًا لدليل Apple App Sandbox Design Guide (2026)، تستند بنية الصندوق الرملي إلى ثلاثة مستويات من الحماية: عزل نظام الملفات، والتحكم في التواصل بين العمليات، وفصل موارد الأجهزة مع طلب الصلاحيات صراحةً عبر entitlements.
الأساسيات
Sandbox هو نظام تحكم إلزامي في الوصول (Mandatory Access Control) مطبَّق على مستوى نواة iOS (XNU — امتداد النواة Sandbox.kext). يحصل كل تطبيق عند تشغيله على ملف تعريف Sandbox فريد من نوع UUID يحدد الموارد التي يُسمح للتطبيق بالوصول إليها.
تتضمن بنية 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 على عدة أدلة محددة مسبقًا يمكن الوصول إليها عبر واجهة برمجة 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 لأنها تجرد البنية الداخلية لنظام الملفات وتبقى مستقرة عند تغيّر 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 (يختار المستخدم ملفًا عبر واجهة النظام، ويحصل التطبيق على عنوان URL آمن النطاق Security-Scoped)، Share Extension (امتداد لنقل البيانات إلى تطبيق آخر)، وApp Groups (دليل مشترك لتطبيقات المطور نفسه).
UIDocumentPicker هو الطريقة الوحيدة للوصول إلى ملفات التطبيقات الأخرى دون إعداد مسبق. يختار المستخدم ملفًا صراحةً عبر منتقي النظام القياسي، ويوفر iOS للتطبيق عنوان URL مؤقتًا آمن النطاق. يستمر الوصول حتى إغلاق المنتقي أو حتى استدعاء stopAccessingSecurityScopedResource.
Security-Scoped Bookmark هو آلية في iOS تسمح بالاحتفاظ بالوصول إلى ملف خارج Sandbox بين عمليات تشغيل التطبيق. عندما يختار المستخدم ملفًا عبر UIDocumentPicker، يمكن للتطبيق إنشاء إشارة مرجعية bookmark من عنوان URL الآمن النطاق وحفظها في UserDefaults أو في تخزين آخر.
في التشغيل التالي، يستعيد التطبيق الوصول عبر URLByResolvingBookmarkData، الذي يعيد عنوان 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
)
}
// تحويل بيانات الإشارة المرجعية إلى URL
func resolveBookmark(data: Data) -> URL? {
var isStale = false
let url = try? URL.byResolvingBookmarkData(
data,
options: .withoutUI,
relativeTo: nil,
bookmarkDataIsStale: &isStale
)
if isStale {
// الإشارة المرجعية قديمة، يلزم إنشاء إشارة جديدة
}
return url
}
قيود مهمة: لا تعمل Security-Scoped Bookmarks للملفات داخل Sandbox الخاص بك — فقط للملفات التي تم الحصول عليها عبر UIDocumentPicker أو iCloud Drive. تحتوي الإشارة المرجعية على بيانات آمنة النطاق تسمح للنظام بتحديد التطبيق الذي يطلب الوصول إلى أي ملف. إذا انتهت صلاحية شهادة التطبيق أو تغيرت، تصبح الإشارة المرجعية غير صالحة.
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 مقيد — لا يمكن للتطبيقات الأخرى الاتصال بخادم داخل تطبيقك (باستثناء البنى المخصصة للتصحيح). كما يتم حظر 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 هي Data تحفظ الوصول إلى ملف خارج Sandbox بين عمليات تشغيل التطبيق. تُنشأ من عنوان URL آمن النطاق (تم الحصول عليه من UIDocumentPicker) عبر bookmarkData. في التشغيل التالي، تُستعاد الإشارة المرجعية عبر URLByResolvingBookmarkData.
لا، لا يمكن تعطيل Sandbox لتطبيقات App Store. على الأجهزة التي تم كسر حمايتها (jailbreak) من الممكن تعطيله، لكن هذا غير متوافق مع النشر في App Store. يمكن للمطورين الاختبار دون Sandbox على المحاكي، لكن الأجهزة الحقيقية تطبق Sandbox دائمًا.
الخلاصة
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.
اقرأ أيضًا