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 — امتداد النواة 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) وتسجيل في سجل النظام.

swift
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قراءة وكتابة
BundleBundle.main.bundlePathقراءة فقط
Library.libraryDirectoryقراءة وكتابة
tmpNSTemporaryDirectory()قراءة وكتابة
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 Bookmarks

Security-Scoped Bookmark هو آلية في iOS تسمح بالاحتفاظ بالوصول إلى ملف خارج Sandbox بين عمليات تشغيل التطبيق. عندما يختار المستخدم ملفًا عبر UIDocumentPicker، يمكن للتطبيق إنشاء إشارة مرجعية bookmark من عنوان URL الآمن النطاق وحفظها في UserDefaults أو في تخزين آخر.

في التشغيل التالي، يستعيد التطبيق الوصول عبر URLByResolvingBookmarkData، الذي يعيد عنوان URL آمن النطاق. ثم يجب استدعاء startAccessingSecurityScopedResource قبل قراءة الملف وstopAccessingSecurityScopedResource بعد الانتهاء. توازن الاستدعاءات إلزامي — لكل start يجب أن يكون هناك stop مطابق، وإلا استنفد النظام حد موارد Security-Scoped.

swift
// إنشاء 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. تحتوي الإشارة المرجعية على بيانات آمنة النطاق تسمح للنظام بتحديد التطبيق الذي يطلب الوصول إلى أي ملف. إذا انتهت صلاحية شهادة التطبيق أو تغيرت، تصبح الإشارة المرجعية غير صالحة.

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 Groups المشترك، حيث يكتب التطبيق الرئيسي البيانات المحدثة. في الوقت نفسه، يظل كل تطبيق معزولًا عن مجموعات App Groups الأخرى — فقط التطبيقات ذات معرف المجموعة نفسه تحصل على الوصول.

قيود الصندوق الرملي في iOS

يفرض Sandbox في iOS عددًا من القيود الصارمة التي يجب مراعاتها أثناء التطوير. أهمها: حظر التعليمات البرمجية الديناميكية (تحميل وتنفيذ التعليمات البرمجية خارج Sandbox)، وحظر الوصول المباشر إلى دفتر العناوين والتقويم والصور دون إذن المستخدم (Privacy framework)، وقيود على إنشاء العمليات الفرعية (fork وexec محظوران).

الشبكة: يمكن للتطبيقات الاتصال بأي خوادم بعيدة عبر TCP/UDP، لكن الوصول إلى localhost مقيد — لا يمكن للتطبيقات الأخرى الاتصال بخادم داخل تطبيقك (باستثناء البنى المخصصة للتصحيح). كما يتم حظر UDP متعدد الإرسال والبث App Store للتطبيقات.

موارد الأجهزة: الوصول إلى الكاميرا والميكروفون والموقع الجغرافي وBluetooth وHealthKit يتطلب إذنًا صريحًا من المستخدم عبر حوار النظام. لكل نوع مورد، يستخدم iOS entitlement منفصلًا ومفتاح Info.plist مع وصف السبب (NSPhotoLibraryUsageDescription، NSCameraUsageDescription). طلب الإذن دون وصف السبب في Info.plist يؤدي إلى إنهاء التطبيق.

  • التعليمات البرمجية الديناميكية — محظورة: JavaScriptCore لـ JS في WebView، لكن ليس تعليمات برمجية آلية عشوائية
  • العمليات الفرعية — fork وexec وsystem غير متاحة من Sandbox
  • الوصول إلى الأجهزة — الكاميرا والميكروفون ونظام تحديد المواقع تتطلب حوار النظام
  • الشبكة المحلية — 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 عنوان URL آمن النطاق، متاحًا حتى استدعاء stopAccessingSecurityScopedResource. البديل هو Share Extension لنقل البيانات بين التطبيقات.

ما هو Security-Scoped Bookmark؟

Security-Scoped Bookmark هي Data تحفظ الوصول إلى ملف خارج Sandbox بين عمليات تشغيل التطبيق. تُنشأ من عنوان URL آمن النطاق (تم الحصول عليه من UIDocumentPicker) عبر bookmarkData. في التشغيل التالي، تُستعاد الإشارة المرجعية عبر URLByResolvingBookmarkData.

هل يمكن تعطيل Sandbox في iOS؟

لا، لا يمكن تعطيل Sandbox لتطبيقات App Store. على الأجهزة التي تم كسر حمايتها (jailbreak) من الممكن تعطيله، لكن هذا غير متوافق مع النشر في 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. سوف نقدم لك النصح ونقترح أفضل حل.

مناقشة المشروع

اقرأ أيضًا