App Group: چیست، ایجاد کانتینر مشترک و تنظیم دسترسی

نویسنده: IT Sectr منتشر شده: 2026-06-17 زمان مطالعه: 8 دقیقه

App Group مکانیزمی در iOS است که یک کانتینر مشترک برای تبادل داده بین برنامه و افزونه‌های آن ایجاد می‌کند. بدون آن، هر فرآیند (برنامه اصلی، ویجت، share extension) در یک sandbox ایزوله کار می‌کند و به داده‌های مؤلفه مجاور دسترسی ندارد. طبق Apple Developer Documentation, 2026، App Group این مشکل را از طریق یک شناسه گروه واحد که در entitlements مشخص می‌شود حل می‌کند. این ابزاری اساسی برای ایجاد تجربه کاربری منسجم در اکوسیستم iOS است.

نکات اصلی

  • App Group — دایرکتوری مشترک در سیستم فایل iOS که برای برنامه و افزونه‌های آن قابل دسترسی است.
  • Identifier با الگوی group.* تشکیل می‌شود و در Capabilities پروژه Xcode اضافه می‌شود.
  • UserDefaults با suite name امکان همگام‌سازی تنظیمات بین فرآیندها را بدون کد اضافی فراهم می‌کند.
  • Core Data از طریق App Group به افزونه‌ها اجازه می‌دهد با تنظیم صحیح Store URL داده‌ها را در پایگاه مشترک بخوانند و بنویسند.
  • امنیت تضمین می‌شود زیرا فقط فرآیندهایی با team ID و entitlement یکسان به کانتینر دسترسی دارند.

App Group چیست؟

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 مربوطه مشخص کنید.

کانتینر مشترک App Group چگونه کار می‌کند

iOS در اولین راه‌اندازی هر فرآیندی که entitlement com.apple.security.application-groups را دارد یک کانتینر مشترک ایجاد می‌کند. از نظر فیزیکی، کانتینر در دایرکتوری سیستمی قرار دارد — مسیر آن با sandbox برنامه اصلی و افزونه‌ها متفاوت است، اما همه فرآیندهای مجاز حق خواندن و نوشتن دارند.

حقوق دسترسی و امنیت

Apple امنیت App Group را از طریق پیوند team ID و امضای کد تضمین می‌کند. فرآیندی که با همان گواهی توسعه‌دهنده امضا نشده باشد نمی‌تواند به کانتینر گروه دسترسی پیدا کند. این کار از نشت داده بین برنامه‌های توسعه‌دهندگان مختلف جلوگیری می‌کند.

شناسه گروه

فرمت شناسه: group.<team-id>.<name>. مثلاً group.ABC123DEFG.widget-data. در یک دستگاه می‌توان چندین گروه ایجاد کرد که هر کدام مجموعه شرکت‌کنندگان خاص خود را دارند. یک برنامه می‌تواند همزمان به چندین App Group تعلق داشته باشد — این برای جدا کردن داده‌های افزونه‌های مختلف مفید است.

swift
// 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

فعال‌سازی App Group در Xcode از Capabilities شروع می‌شود — کلید App Groups entitlement را به پروژه اضافه می‌کند. Apple Developer Portal همچنین نیاز دارد که شناسه برنامه شامل این capability باشد. بدون آن، امضای کد روی دستگاه واقعی کار نخواهد کرد.

تنظیم گام به گام

پروژه را در Xcode باز کنید، target برنامه را انتخاب کنید و به برگه Signing & Capabilities بروید. روی + کلیک کنید و App Groups را انتخاب کنید. یک گروه جدید ایجاد کنید یا یک گروه موجود را انتخاب کنید. همان مراحل را برای هر افزونه‌ای که باید به کانتینر مشترک دسترسی داشته باشد تکرار کنید. همه شرکت‌کنندگان باید از یک شناسه گروه استفاده کنند.

بررسی entitlements

پس از فعال‌سازی Capabilities، Xcode به طور خودکار فایل .entitlements را با کلید com.apple.security.application-groups و آرایه‌ای از شناسه‌ها ایجاد می‌کند. مطمئن شوید که همه افزونه‌های لازم این فایل را با team ID صحیح در شناسه گروه دارند.

xml
<!-- 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 با App Group

ساده‌ترین راه برای همگام‌سازی داده بین برنامه و افزونه‌ها — UserDefaults با مشخص کردن suite name. به جای UserDefaults.standard استاندارد، یک نمونه با شناسه App Group ایجاد می‌کنید و همه فرآیندها تنظیمات یکسانی را می‌خوانند.

طبق Apple Human Interface Guidelines، این مکانیزم برای همگام‌سازی وضعیت مناسب است: تم انتخاب‌شده، موارد دلخواه، پرچم‌های onbording. با این حال برای حجم زیاد داده یا عملیات نوشتن همزمان طراحی نشده است — برای این کار از فایل‌ها یا Core Data استفاده کنید.

swift
// نوشتن در 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+ می‌توان آن را حذف کرد زیرا سیستم به طور دوره‌ای داده‌ها را همگام‌سازی می‌کند.

دسترسی مشترک به فایل‌ها و Core Data

برای سناریوهای پیچیده‌تر، App Group دسترسی به سیستم فایل مشترک را فراهم می‌کند. هر فایلی که در دایرکتوری کانتینر ایجاد شود برای همه فرآیندهای گروه قابل دسترسی است. این امکان پیاده‌سازی پایگاه Core Data مشترک، کش تصاویر یا فایل‌های موقت را فراهم می‌کند.

تنظیم Core Data با App Group

برای استفاده از ذخیره‌ساز مشترک Core Data، NSPersistentContainer را با URL فایل .sqlite واقع در دایرکتوری App Group ایجاد کنید. مطمئن شوید که فقط یک فرآیند در یک زمان در پایگاه می‌نویسد — نوشتن همزمان ممکن است داده‌ها را خراب کند. معماری معمول: برنامه اصلی می‌نویسد، افزونه‌ها می‌خوانند.

swift
// تنظیم 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 چیست؟

App Group مکانیزم iOS است که یک کانتینر مشترک برای ذخیره داده بین برنامه و افزونه‌های آن ایجاد می‌کند. این مکانیزم به فرآیندهای با شناسه گروه یکسان اجازه می‌دهد از طریق یک دایرکتوری واحد در سیستم فایل، فایل‌ها، تنظیمات UserDefaults و داده‌های Core Data را مبادله کنند.

چگونه App Group در Xcode ایجاد کنیم؟

Capabilities target را در Xcode باز کنید، App Groups را فعال کنید و یک شناسه با فرمت group.* اضافه کنید. سپس همان مراحل را برای هر افزونه‌ای که باید به کانتینر مشترک دسترسی داشته باشد تکرار کنید. مطمئن شوید همه شرکت‌کنندگان از یک شناسه گروه استفاده می‌کنند.

کدام افزونه‌ها می‌توانند از App Group استفاده کنند؟

همه انواع افزونه‌های iOS از App Group پشتیبانی می‌کنند: Today Widget (widget extension)، Share Extension، Notification Service Extension، Custom Keyboard و سایر. هر افزونه باید فایل entitlements جداگانه خود را با همان شناسه گروه برنامه اصلی داشته باشد.

آیا می‌توان از App Group بین برنامه‌های مختلف استفاده کرد؟

بله، اما فقط اگر برنامه‌ها با همان گواهی توسعه‌دهنده امضا شده باشند و team ID یکسانی داشته باشند. Apple امنیت را از طریق امضای کد تضمین می‌کند: دو برنامه از توسعه‌دهندگان مختلف حتی با شناسه گروه یکسان نمی‌توانند به یک کانتینر دسترسی پیدا کنند.

چگونه داده‌ها را از طریق App Group بین برنامه و ویجت همگام‌سازی کنیم؟

برای تنظیمات کوچک از UserDefaults با suite name، برای فایل‌ها از FileManager و برای داده‌های ساختاریافته از Core Data استفاده کنید. همه این APIها با دایرکتوری App Group کار می‌کنند — فقط کافی است شناسه گروه را هنگام مقداردهی اولیه مشخص کنید. برای Core Data مطمئن شوید URL ذخیره‌ساز به دایرکتوری مشترک اشاره می‌کند.

خلاصه

  • App Group تنها راه سازماندهی تبادل داده بین برنامه iOS و افزونه‌های آن از طریق یک کانتینر مشترک در سیستم فایل است.
  • شناسه گروه دارای فرمت group.<team-id>.<name> است و از طریق Capabilities Xcode با فایل entitlements اجباری برای هر target اضافه می‌شود.
  • UserDefaults با suite name ساده‌ترین روش همگام‌سازی تنظیمات و پرچم‌ها بین فرآیندها بدون نیاز به مدیریت فایل است.
  • Core Data با App Group نیاز به مشخص کردن URL ذخیره‌ساز در داخل کانتینر و هماهنگی دسترسی بین فرآیندها برای جلوگیری از خراب شدن پایگاه دارد.
  • FileManager.containerURL مسیر دایرکتوری مشترک را برمی‌گرداند که برای همه فرآیندهای دارای entitlements صحیح یکسان است.
  • امنیت داده با بررسی team ID و امضای کد تضمین می‌شود — فقط برنامه‌های یک توسعه‌دهنده به کانتینر مشترک دسترسی دارند.
  • برای نوشتن همزمان در فایل‌های مشترک از NSFileCoordinator و برای همگام‌سازی تغییرات بین فرآیندها از Darwin Notifications یا CFNotificationCenter استفاده کنید.

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید