App Group هي آلية في iOS تنشئ حاوية مشتركة لتبادل البيانات بين التطبيق وإضافاته. بدونها، يعمل كل عملية (التطبيق الرئيسي، القطعة، إضافة المشاركة) في بيئة معزولة ولا يمكنها الوصول إلى بيانات المكون المجاور. وفقاً لـ Apple Developer Documentation, 2026، App Group يحل هذه المشكلة من خلال معرف مجموعة واحد محدد في التصريحات. إنها أداة أساسية لإنشاء تجربة مستخدم متسقة في نظام iOS البيئي.
الخلاصة
App Group هي آلية في نظام التشغيل iOS توفر مساحة تخزين مشتركة لعمليات متعددة لنفس المطور. بدونها، تعمل كل إضافة في بيئة معزولة ولا يمكنها قراءة البيانات التي كتبها مكون آخر. يحل App Group هذه العزلة عن طريق إنشاء دليل على نظام الملفات يمكن الوصول إليه من قبل جميع العمليات التي لديها التصريحات الصحيحة.
يبدأ معرف المجموعة بالبادئة group. ويتم تحديده في ملف التصريحات للمشروع. في Xcode، يضاف هذا المعرف عبر Capabilities — يقوم النظام بتضمينه تلقائياً في توقيع التطبيق. بعد التهيئة، يحصل جميع أعضاء المجموعة على إمكانية الوصول إلى الدليل المشترك في Library/Application Support/ داخل الحاوية.
وفقاً لـ Apple WWDC 2020 Session 10026، يغطي App Group ثلاثة سيناريوهات رئيسية: مزامنة الإعدادات عبر NSUserDefaults، المشاركة في الملفات عبر FileManager، وقاعدة بيانات Core Data مشتركة مع مخزن واحد. كل سيناريو يتطلب فقط تحديد معرف المجموعة في API المقابلة.
يقوم iOS بإنشاء الحاوية المشتركة عند أول تشغيل لأي عملية لديها تصريح com.apple.security.application-groups. فيزيائياً، توجد الحاوية في دليل النظام — مسارها يختلف عن البيئة المعزولة للتطبيق الرئيسي والإضافات، لكن جميع العمليات المصرح لها تملك صلاحيات القراءة والكتابة.
تضمن Apple الأمان لـ App Group من خلال الجمع بين team ID وتوقيع الكود. العملية التي لم يتم توقيعها بنفس شهادة المطور لا يمكنها الوصول إلى حاوية المجموعة. هذا يمنع تسرب البيانات بين تطبيقات المطورين المختلفين.
صيغة المعرف: group.<team-id>.<name>. على سبيل المثال، group.ABC123DEFG.widget-data. يمكن إنشاء مجموعات متعددة على جهاز واحد، كل منها بمجموعة أعضائها الخاصة. يمكن لتطبيق واحد أن ينتمي إلى عدة App Groups في نفس الوقت — وهذا مفيد لفصل بيانات الإضافات المختلفة.
// Get the App Group container URL
guard let containerURL = FileManager.default
.containerURL(forSecurityApplicationGroupIdentifier: "group.com.example.widget")
else { return }
// Create a file in the shared container
let fileURL = containerURL.appendingPathComponent("shared.data")
try "Hello from main app".write(to: fileURL, atomically: true, encoding: .utf8)
يوفر FileManager طريقة containerURL(forSecurityApplicationGroupIdentifier:) التي ترجع URL الدليل المشترك. من المهم استدعاء هذه الطريقة بشكل منفصل في كل عملية — المسار متطابق فيزيائياً، لكن كل عملية تراه من خلال منظورها الأمني الخاص.
يبدأ تمكين App Group في Xcode من Capabilities — مفتاح App Groups يضيف التصريح إلى المشروع. يتطلب Apple Developer Portal أيضاً أن يتضمن معرف التطبيق هذه الإمكانية. بدونها، لن يعمل توقيع الكود على جهاز حقيقي.
افتح مشروعك في Xcode، حدد target التطبيق وانتقل إلى علامة التبويب Signing & Capabilities. انقر على + واختر App Groups. أنشئ أو اختر مجموعة موجودة. كرر نفس الخطوات لكل إضافة تحتاج إلى الوصول إلى الحاوية المشتركة. يجب على جميع المشاركين استخدام نفس معرف المجموعة.
بعد تمكين Capabilities، يقوم Xcode تلقائياً بإنشاء ملف .entitlements بمفتاح com.apple.security.application-groups ومصفوفة من المعرفات. تأكد من أن جميع الإضافات الضرورية لديها هذا الملف مع team ID الصحيح في معرف المجموعة.
<!-- Example entitlements file -->
<key>com.apple.security.application-groups</key>
<array>
<string>group.com.example.shared</string>
</array>
إذا كان مشروعك يحتوي على إضافات متعددة (Today Widget، Share Extension، Notification Service)، يجب أن يكون لكل منها ملف تصريحات خاص بها مع نفس المجموعة. غياب التصريحات في أي target هو سبب شائع لعدم رؤية الإضافة للبيانات المشتركة.
أبسط طريقة لمزامنة البيانات بين التطبيق وإضافاته هي UserDefaults مع suite name. بدلاً من UserDefaults.standard القياسي، تقوم بإنشاء مثيل مع معرف App Group، وتقرأ جميع العمليات نفس الإعدادات.
وفقاً لـ Apple Human Interface Guidelines، هذه الآلية مناسبة لمزامنة الحالة: السمة المحددة، المفضلة، علامات الإعداد. ومع ذلك، فهي ليست مخصصة لأحجام البيانات الكبيرة أو عمليات الكتابة المتزامنة — لهذا استخدم الملفات أو Core Data.
// Write to UserDefaults App Group (main app)
let defaults = UserDefaults(suiteName: "group.com.example.shared")
defaults?.set(true, forKey: "isDarkMode")
defaults?.synchronize()
// Read from UserDefaults App Group (widget extension)
let sharedDefaults = UserDefaults(suiteName: "group.com.example.shared")
let isDark = sharedDefaults?.bool(forKey: "isDarkMode") ?? false
لاحظ: يتم إنشاء مثيل UserDefaults مع suiteName بشكل منفصل في كل عملية ولكنه يقرأ من نفس ملف plist في الحاوية المشتركة. طريقة synchronize() تضمن الكتابة الفورية على القرص — في iOS 13+ يمكن حذفها لأن النظام يقوم بمزامنة البيانات بشكل دوري.
للسيناريوهات الأكثر تعقيداً، يوفر App Group الوصول إلى نظام ملفات مشترك. أي ملف يتم إنشاؤه في دليل الحاوية يمكن الوصول إليه من قبل جميع عمليات المجموعة. هذا يسمح بقاعدة بيانات Core Data مشتركة، أو تخزين مؤقت للصور، أو ملفات مؤقتة.
لاستخدام مخزن Core Data مشترك، قم بإنشاء NSPersistentContainer مع URL ملف .sqlite الموجود في دليل App Group. تأكد من أن عملية واحدة فقط تكتب في قاعدة البيانات في كل مرة — الكتابة المتزامنة قد تتلف البيانات. الهندسة النموذجية: التطبيق الرئيسي يكتب، الإضافات تقرأ.
// Setup Core Data with App Group container
lazy var persistentContainer: NSPersistentContainer = {
let container = NSPersistentContainer(name: "SharedModel")
guard let appGroupURL = FileManager.default
.containerURL(forSecurityApplicationGroupIdentifier: "group.com.example.shared")
else { return container }
let storeURL = appGroupURL.appendingPathComponent("SharedModel.sqlite")
container.persistentStoreDescriptions = [NSPersistentStoreDescription(url: storeURL)]
container.loadPersistentStores { _, error in
if let error = error { fatalError(error.localizedDescription) }
}
return container
}()
نهج بديل هو التخزين المؤقت للصور على أساس الملفات. NSCache يعيش فقط في الذاكرة، ولكن عبر App Group يمكن حفظ الصور المخزنة مؤقتاً على القرص في الدليل المشترك. إضافة القطعة يمكنها الوصول إلى نفس الملفات وعرض البيانات المحدثة دون تحميل إضافي من الشبكة.
| السيناريو | API الموصى به | حجم البيانات |
|---|---|---|
| الإعدادات والعلامات | UserDefaults suiteName | حتى 1 كيلوبايت |
| التخزين المؤقت للصور | FileManager + NSCache | حتى 100 ميجابايت |
| البيانات المنظمة | Core Data store | حتى 500 ميجابايت |
| الملفات المؤقتة | FileManager مؤقت | حتى 50 ميجابايت |
عند العمل مع الملفات المشتركة، ضع في اعتبارك أن النظام قد ينهي الإضافة في أي وقت. استخدم NSFileCoordinator لتنسيق الوصول وتجنب تلف البيانات عند الكتابة المتزامنة من قبل عمليات متعددة.
الأسئلة الشائعة
App Group هي آلية في iOS تنشئ حاوية مشتركة لتخزين البيانات بين التطبيق وإضافاته. تسمح للعمليات التي لها نفس معرف المجموعة بتبادل الملفات وإعدادات UserDefaults وبيانات Core Data من خلال دليل واحد على نظام الملفات.
افتح Capabilities الهدف في Xcode، فعّل App Groups وأضف معرفاً بالصيغة group.*. ثم كرر نفس الخطوات لكل إضافة تحتاج إلى الوصول إلى الحاوية المشتركة. تأكد من أن جميع المشاركين يستخدمون نفس معرف المجموعة.
جميع أنواع إضافات iOS تدعم App Group: Today Widget (إضافة القطعة)، Share Extension، Notification Service Extension، Custom Keyboard وغيرها. يجب أن تحتوي كل إضافة على ملف تصريحات منفصل مع نفس معرف المجموعة المستخدم في التطبيق الرئيسي.
نعم، ولكن فقط إذا كانت التطبيقات موقعة بنفس شهادة المطور ولديها نفس team ID. تضمن Apple الأمان من خلال توقيع الكود: تطبيقان من مطورين مختلفين لا يمكنهما الوصول إلى نفس الحاوية حتى مع معرف مجموعة متطابق.
استخدم UserDefaults مع suite name للإعدادات الصغيرة، FileManager للملفات، و Core Data للبيانات المنظمة. جميع هذه الـ APIs تعمل مع دليل App Group — فقط حدد معرف المجموعة أثناء التهيئة. لـ Core Data، تأكد من أن URL المخزن يشير إلى الدليل المشترك.
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.