普通视图

发现新文章,点击刷新页面。
今天 — 2026年1月24日首页

App Groups in iOS

作者 songgeb
2026年1月23日 14:41

参考:developer.apple.com/documentati…

一、什么是 App Group

  • App Group 允许同一开发者团队(Team)下的多个 App访问一个或多个共享空间(Shared Container)
  • 默认情况下(未使用 App Group):
    • 每个 App 都运行在独立进程
    • 拥有独立 沙盒
    • 无法进行数据共享
    • 无法进行 进程间通信
  • 对于 iOS 应用
    • 即使开启了 App Group
    • 只能实现多 App / App Extension 之间的数据或空间共享
    • 无法实现真正的跨进程通信( IPC
  • 对于 macOS 应用
    • App Group 可以放宽沙盒边界
    • 允许通过 Mach IPC、UNIX domain socket 等机制实现 IPC

⚠️ App Group 在 iOS 与 macOS 上的能力存在显著差异

二、App Group 的历史背景

  • App Group 是在 WWDC 2014 中提出的能力
  • iOS 8(以及 OS X 10.10 Yosemite)一起发布
  • 设计初衷是配合 App Extension 的出现:
    • 主 App
    • Widget
    • Share / Action Extension
    • 等多个进程之间的安全数据共享

三、App Group 的基本规则与限制

1. 数量限制

  • 一个开发者账号 最多可以注册 1000 个 App Group
  • 一个 App:
    • 可以不使用 App Group
    • 也可以属于一个或多个 App Group

2. 使用范围

  • 以下组合都可以使用 App Group:
    • App ↔ App Extension
    • App ↔ App
    • App ↔ App Clip

3. Container ID 规则

  • 创建 App Group 时需要设置一个 Container ID
  • Container ID 用于标识共享空间
  • 当 App Group 包含 iOS App(而非 macOS App)时
    • Container ID 必须以 group. 作为前缀

示例:

group.com.company.shared

四、iOS 中 App Group 能做什么,不能做什么

4.1 能做的事情

  • 多进程( App / Extension/App Clip)共享数据

4.2 不能做的事情

  • ❌ 不支持进程间通信(IPC)
  • ❌ 不支持 Mach IPC、socket、shared memory 等机制
  • ❌ 不能假设共享目录的真实路径
  • ❌ 不能假设共享目录一定长期存在

在 iOS 中,App Group 的本质是: 共享存储权限,而不是通信权限

五、iOS App 使用 App Group 共享空间的方式

系统提供了三种主要方式:

5.1 通过 UserDefaults 共享数据

  • 必须使用 init(suiteName:) 初始化

let defaults = UserDefaults(suiteName: "group.com.company.shared") ``defaults?.set("value", forKey: "key")

适用于:

  • 配置项
  • 功能开关
  • 小体量状态数据

5.2 通过共享容器路径读写文件

  • 使用 containerURL(forSecurityApplicationGroupIdentifier:) 获取共享空间 URL

let containerURL = FileManager.default.containerURL( ``forSecurityApplicationGroupIdentifier: "group.com.company.shared" )

说明:

  • 系统只会自动创建 Library/Caches 目录
  • 其他目录需要自行创建
  • 适合存储:
    • JSON
    • SQLite
    • 缓存文件

5.3 App Extension 使用 Background URL Session

  • 对于 App Extension:
    • 使用 URLSessionConfiguration.background
    • 设置 sharedContainerIdentifier
  • 下载的数据会直接存储在 App Group 的共享空间中

适用于:

  • 后台下载
  • Extension 与主 App 共享下载结果

六、工程实践注意事项

  • 不要写死 App Group 的磁盘路径
  • 不要假设共享容器一定存在
    • 当设备上属于同一个app group中的所有应用都卸载后,共享容器也会被删除
  • 多个 App / Extension 需要:
    • 统一目录结构
    • 统一数据格式

七、总结

  • App Group 是 iOS 8 引入的一项共享容器能力
  • 在 iOS 平台上:
    • 它解决的是数据共享问题
    • 而不是进程间通信 问题
  • 合理使用 App Group,可以安全地协调多个 App / Extension 之间的状态与资源
❌
❌