App Group:什么是它、创建共享容器和配置访问权限

作者: IT Sectr 发布日期: 2026-06-17 阅读时间: 8 分钟

App Group 是 iOS 的一种机制,它在应用及其扩展之间创建一个共享容器用于数据交换。没有它,每个进程(主应用、widget、share extension)都在独立的沙盒中运行,无法访问邻近组件的数据。根据 Apple Developer Documentation, 2026App Group 通过在 entitlements 中指定的统一组标识符解决这个问题。这是在 iOS 生态系统中创建一致用户体验的基础工具。

要点

  • App Group — iOS 文件系统中的共享目录,可供应用及其扩展访问。
  • Identifier 按 group.* 模板形成,并在 Xcode 项目的 Capabilities 中添加。
  • UserDefaults 使用 suite name 允许进程之间无需额外代码即可同步设置。
  • Core Data 通过 App Group 使扩展能够在正确配置 Store URL 的情况下读取和写入共享数据库中的数据。
  • 安全性 通过仅允许具有相同 team ID 和 entitlement 的进程访问容器来保证。

什么是 App Group?

App Group 是 iOS 操作系统的一种机制,它为同一开发者的多个进程提供共享存储区域。没有它,每个扩展都在自己的沙盒中运行,无法读取其他组件写入的数据。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 在首次运行任何具有 com.apple.security.application-groups entitlement 的进程时创建共享容器。物理上,容器位于系统目录中 — 其路径与主应用和扩展的沙盒不同,但所有授权的进程都有读写权限。

访问权限和安全性

Apple 通过 team ID 和代码签名的关联来保证 App Group 的安全性。未使用相同开发者证书签名的进程无法访问组容器。这防止了不同开发者应用之间的数据泄露。

组标识符

标识符格式:group.<team-id>.<name>。例如,group.ABC123DEFG.widget-data。在一台设备上可以创建多个组,每个组有自己的一组参与者。一个应用可以同时属于多个 App Group — 这对于分离不同扩展的数据很有用。

swift
// 获取 App Group 容器 URL
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。重要的是在每个进程中单独调用此方法 — 路径物理上相同,但每个进程通过自己的安全视角看到它。

在 Xcode 中配置 App Group

Xcode 中启用 App Group 从 Capabilities 开始 — App Groups 开关向项目添加 entitlement。Apple Developer Portal 也要求应用标识符包含此功能。没有它,代码签名将无法在真实设备上工作。

逐步配置

在 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 文件,包含相同的组。任何 target 的 entitlements 缺失 是扩展无法看到共享数据的常见原因。

将 UserDefaults 与 App Group 一起使用

在应用和扩展之间同步数据的最简单方法 — 使用指定 suite name 的 UserDefaults。您不用创建标准的 UserDefaults.standard,而是使用 App Group 标识符创建实例,所有进程读取相同的设置。

根据 Apple Human Interface Guidelines,此机制适用于状态同步:选定的主题、收藏的项目、onboarding 标志。但是,它不适用于大量数据或并发写入操作 — 为此请使用文件或 Core Data。

swift
// 写入 UserDefaults App Group(主应用)
let defaults = UserDefaults(suiteName: "group.com.example.shared")
defaults?.set(true, forKey: "isDarkMode")
defaults?.synchronize()

// 从 UserDefaults App Group 读取(widget 扩展)
let sharedDefaults = UserDefaults(suiteName: "group.com.example.shared")
let isDark = sharedDefaults?.bool(forKey: "isDarkMode") ?? false

请注意:使用 suiteName 的 UserDefaults 实例在每个进程中单独创建,但读取共享容器中的同一个 plist 文件。synchronize() 方法保证立即写入磁盘 — 在 iOS 13+ 中可以省略,因为系统会定期同步数据。

对文件和 Core Data 的共享访问

对于更复杂的场景,App Group 提供对共享文件系统的访问。在容器目录中创建的任何文件都可以被组的所有进程访问。这允许实现共享的 Core Data 数据库、图片缓存或临时文件。

使用 App Group 配置 Core Data

要使用共享的 Core Data 存储,请创建 NSPersistentContainer,其 URL 指向位于 App Group 目录中的 .sqlite 文件。确保一次只有一个进程写入数据库 — 并发写入可能会损坏数据。典型架构:主应用写入,扩展读取。

swift
// 使用 App Group 容器设置 Core Data
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,您可以将缓存的图片保存到共享目录中的磁盘上。widget 扩展可以访问相同的文件,并在没有额外网络加载的情况下显示最新数据。

场景推荐 API数据大小
设置和标志UserDefaults suiteName最多 1 KB
图片缓存FileManager + NSCache最多 100 MB
结构化数据Core Data store最多 500 MB
临时文件FileManager temporary最多 50 MB

在处理共享文件时,请考虑系统可能随时卸载扩展。使用 NSFileCoordinator 协调访问,以避免不同进程同时写入时数据损坏。

常见问题

iOS 中的 App Group 是什么?

App Group 是 iOS 的一种机制,它在应用及其扩展之间创建共享容器用于数据存储。它允许具有相同组标识符的进程通过文件系统中的单个目录交换文件、UserDefaults 设置和 Core Data 数据。

如何在 Xcode 中创建 App Group?

在 Xcode 中打开 target 的 Capabilities,启用 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 在应用和 widget 之间同步数据?

对于小的设置使用带有 suite name 的 UserDefaults,对于文件使用 FileManager,对于结构化数据使用 Core Data。所有这些 API 都适用于 App Group 目录 — 只需在初始化时指定组标识符。对于 Core Data,请确保存储 URL 指向共享目录。

总结

  • App Group 是通过文件系统中的共享容器在 iOS 应用及其扩展之间组织数据交换的唯一方式。
  • 组标识符的格式为 group.<team-id>.<name>,通过 Xcode Capabilities 添加,每个 target 都有必需的 entitlements 文件。
  • 带有 suite name 的 UserDefaults 是在进程之间同步设置和标志的最简单方法,无需管理文件。
  • 使用 App Group 的 Core Data 需要在容器内指定存储 URL,并在进程之间 协调访问,以避免数据库损坏。
  • FileManager.containerURL 返回共享目录的路径,所有具有正确 entitlements 的进程都使用相同的路径。
  • 数据安全性通过检查 team ID 和代码签名来保证 — 只有同一开发者的应用才能访问共享容器。
  • 对于共享文件中的并发写入,使用 NSFileCoordinator;对于进程之间的更改同步,使用 Darwin Notifications 或 CFNotificationCenter。

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读