App Group مکانیزمی در iOS است که یک کانتینر مشترک برای تبادل داده بین برنامه و افزونههای آن ایجاد میکند. بدون آن، هر فرآیند (برنامه اصلی، ویجت، share extension) در یک sandbox ایزوله کار میکند و به دادههای مؤلفه مجاور دسترسی ندارد. طبق Apple Developer Documentation, 2026، App Group این مشکل را از طریق یک شناسه گروه واحد که در entitlements مشخص میشود حل میکند. این ابزاری اساسی برای ایجاد تجربه کاربری منسجم در اکوسیستم iOS است.
نکات اصلی
App Group مکانیزمی در سیستم عامل iOS است که یک فضای ذخیرهسازی مشترک برای چندین فرآیند از یک توسعهدهنده فراهم میکند. بدون آن، هر افزونه در sandbox خود کار میکند و نمیتواند دادههایی را که مؤلفه دیگری نوشته است بخواند. App Group این ایزولاسیون را با ایجاد دایرکتوری در سیستم فایل که برای همه فرآیندهای دارای entitlements صحیح قابل دسترسی است حل میکند.
شناسه گروه با پیشوند group. شروع میشود و در فایل entitlements پروژه مشخص میشود. در Xcode این شناسه از طریق Capabilities اضافه میشود — سیستم به طور خودکار آن را در امضای برنامه قرار میدهد. پس از تنظیم، همه اعضای گروه به دایرکتوری مشترک در مسیر Library/Application Support/ داخل کانتینر دسترسی پیدا میکنند.
طبق Apple WWDC 2020 Session 10026، App Group سه سناریوی کلیدی را پوشش میدهد: همگامسازی تنظیمات از طریق NSUserDefaults، دسترسی مشترک به فایلها از طریق FileManager و استفاده مشترک از Core Data با یک ذخیرهساز واحد. برای هر سناریو فقط کافی است شناسه گروه را در API مربوطه مشخص کنید.
iOS در اولین راهاندازی هر فرآیندی که entitlement com.apple.security.application-groups را دارد یک کانتینر مشترک ایجاد میکند. از نظر فیزیکی، کانتینر در دایرکتوری سیستمی قرار دارد — مسیر آن با sandbox برنامه اصلی و افزونهها متفاوت است، اما همه فرآیندهای مجاز حق خواندن و نوشتن دارند.
Apple امنیت App Group را از طریق پیوند team ID و امضای کد تضمین میکند. فرآیندی که با همان گواهی توسعهدهنده امضا نشده باشد نمیتواند به کانتینر گروه دسترسی پیدا کند. این کار از نشت داده بین برنامههای توسعهدهندگان مختلف جلوگیری میکند.
فرمت شناسه: group.<team-id>.<name>. مثلاً group.ABC123DEFG.widget-data. در یک دستگاه میتوان چندین گروه ایجاد کرد که هر کدام مجموعه شرکتکنندگان خاص خود را دارند. یک برنامه میتواند همزمان به چندین App Group تعلق داشته باشد — این برای جدا کردن دادههای افزونههای مختلف مفید است.
// URL کانتینر App Group را دریافت کنید
guard let containerURL = FileManager.default
.containerURL(forSecurityApplicationGroupIdentifier: "group.com.example.widget")
else { return }
// یک فایل در کانتینر مشترک ایجاد کنید
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 entitlement را به پروژه اضافه میکند. Apple Developer Portal همچنین نیاز دارد که شناسه برنامه شامل این capability باشد. بدون آن، امضای کد روی دستگاه واقعی کار نخواهد کرد.
پروژه را در 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)، هر کدام باید فایل entitlements خود را با همان گروه داشته باشند. عدم وجود entitlements در هر target دلیل رایجی است که افزونه دادههای مشترک را نمیبیند.
سادهترین راه برای همگامسازی داده بین برنامه و افزونهها — UserDefaults با مشخص کردن suite name. به جای UserDefaults.standard استاندارد، یک نمونه با شناسه App Group ایجاد میکنید و همه فرآیندها تنظیمات یکسانی را میخوانند.
طبق Apple Human Interface Guidelines، این مکانیزم برای همگامسازی وضعیت مناسب است: تم انتخابشده، موارد دلخواه، پرچمهای onbording. با این حال برای حجم زیاد داده یا عملیات نوشتن همزمان طراحی نشده است — برای این کار از فایلها یا Core Data استفاده کنید.
// نوشتن در UserDefaults App Group (برنامه اصلی)
let defaults = UserDefaults(suiteName: "group.com.example.shared")
defaults?.set(true, forKey: "isDarkMode")
defaults?.synchronize()
// خواندن از UserDefaults App Group (افزونه ویجت)
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 ایجاد کنید. مطمئن شوید که فقط یک فرآیند در یک زمان در پایگاه مینویسد — نوشتن همزمان ممکن است دادهها را خراب کند. معماری معمول: برنامه اصلی مینویسد، افزونهها میخوانند.
// تنظیم Core Data با کانتینر App Group
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 temporary | تا 50 مگابایت |
هنگام کار با فایلهای مشترک در نظر داشته باشید که سیستم ممکن است در هر لحظه افزونه را از حافظه خارج کند. برای هماهنگی دسترسی و جلوگیری از خراب شدن داده در هنگام نوشتن همزمان توسط فرآیندهای مختلف از NSFileCoordinator استفاده کنید.
سوالات متداول
App Group مکانیزم iOS است که یک کانتینر مشترک برای ذخیره داده بین برنامه و افزونههای آن ایجاد میکند. این مکانیزم به فرآیندهای با شناسه گروه یکسان اجازه میدهد از طریق یک دایرکتوری واحد در سیستم فایل، فایلها، تنظیمات UserDefaults و دادههای Core Data را مبادله کنند.
Capabilities target را در Xcode باز کنید، App Groups را فعال کنید و یک شناسه با فرمت group.* اضافه کنید. سپس همان مراحل را برای هر افزونهای که باید به کانتینر مشترک دسترسی داشته باشد تکرار کنید. مطمئن شوید همه شرکتکنندگان از یک شناسه گروه استفاده میکنند.
همه انواع افزونههای iOS از App Group پشتیبانی میکنند: Today Widget (widget extension)، Share Extension، Notification Service Extension، Custom Keyboard و سایر. هر افزونه باید فایل entitlements جداگانه خود را با همان شناسه گروه برنامه اصلی داشته باشد.
بله، اما فقط اگر برنامهها با همان گواهی توسعهدهنده امضا شده باشند و team ID یکسانی داشته باشند. Apple امنیت را از طریق امضای کد تضمین میکند: دو برنامه از توسعهدهندگان مختلف حتی با شناسه گروه یکسان نمیتوانند به یک کانتینر دسترسی پیدا کنند.
برای تنظیمات کوچک از UserDefaults با suite name، برای فایلها از FileManager و برای دادههای ساختاریافته از Core Data استفاده کنید. همه این APIها با دایرکتوری App Group کار میکنند — فقط کافی است شناسه گروه را هنگام مقداردهی اولیه مشخص کنید. برای Core Data مطمئن شوید URL ذخیرهساز به دایرکتوری مشترک اشاره میکند.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید