在 uni-app 的 iOS 端开发中,AppGroup 配置绝不能掉以轻心,必须通过手动方式完成:先在 Xcode 中添加 Capability,再创建并关联 .entitlements 文件,最后准确填写 group ID(例如 group.com.yourcompany.yourapp 这种标准格式),否则 NSUserDefaults 共享和文件共享能力都会失效。

uni-app 在 iOS 端无法仅通过配置项自动开启 AppGroup,必须手动修改原生工程并正确配置 entitlements 文件,否则 NSUserDefaults、NSFileManager 等跨进程数据共享能力将全部无法正常使用。
iOS原生工程中添加AppGroup Capability
生成打包后的 ios_build 目录后,使用 Xcode 打开 unpackage/res/ios/xxx.xcworkspace(注意这里必须打开 .xcworkspace,不是 .xcodeproj)。接着在 Project Navigator 中选中项目根节点,依次进入 Signing & Capabilities,点击“+ Capability”,搜索并添加 App Groups。添加完成后,勾选对应的 group,格式必须为 group.com.yourcompany.yourapp,开头不能包含空格或下划线。
常见错误现象:
- Xcode 提示 “No profiles for 'group.com.xxx' were found”:通常表示 Apple Developer 账号尚未在 Identifiers 中创建对应的 App Group
- 真机运行时报
Failed to get shared container URL:说明 entitlements 未生效,或 bundle ID 与 provisioning profile 不一致
适用场景:只有在主 App 与 Today Extension、Widget、Share Extension 或后台 Service 之间需要共享 NSUserDefaults 或共享文件时,才必须启用 AppGroup;如果是 App 内部多进程场景(例如 IM SDK 子进程),同样依赖这项配置。
确保entitlements文件被正确引用
uni-app 默认不会自动生成 .entitlements 文件,因此需要手动创建并绑定到对应 Target:
- 在 Xcode 中右键项目 → New File → iOS → Property List,命名为
xxx.entitlements(xxx 为 target 名) - 双击打开文件后,新增 Key:
com.apple.security.application-groups,Type 设置为 Array,Item 0 填入完整的 group ID(如group.com.yourcompany.yourapp) - 选中 Target → Signing & Capabilities → 在“Signing Certificate”下方找到“Entitlements File”,下拉选择刚创建的
xxx.entitlements
需要注意的是:HBuilderX 4.20+ 版本虽然会在打包时尝试注入 entitlements,但如果 Xcode 中没有显式指定,实际构建过程依旧可能忽略该配置;因此务必以 Xcode 界面中显示的 Entitlements File 路径为最终依据。
代码中读写共享数据的正确方式
不能直接使用 uni.getStorageSync 或 plus.storage,因为它们只作用于当前进程的沙盒环境。要实现 iOS AppGroup 数据共享,必须通过原生 API 进行桥接:
- 读取共享 UserDefaults:
NSUserDefaults.alloc().initWithSuiteName('group.com.yourcompany.yourapp') - 写入完成后必须调用
synchronize(),否则其他进程可能无法及时读取最新数据 - 共享文件路径应通过
NSFileManager.defaultManager().containerURLForSecurityApplicationGroupIdentifier获取,而不是使用NSHomeDirectory()
性能方面也要关注:跨进程访问 UserDefaults 会有一定延迟(iOS 17 实测平均约 8–15ms),如果存在高频写入需求,建议改为“文件 + watcher”机制,或者结合 NSCache 增加本地缓存层,以提升整体性能。
调试时验证AppGroup是否生效
开发和调试过程中,最容易被忽略的往往是权限校验步骤:
- 在 Xcode 控制台执行
po NSFileManager.defaultManager().containerURLForSecurityApplicationGroupIdentifier("group.com.yourcompany.yourapp"),如果返回nil,说明配置未生效 - 检查证书配置:Provisioning Profile 必须包含该 App Group,并且在 Apple Developer Portal 中对应的 App ID 已勾选 Groups 权限
- 注意区分 Debug 和 Release:Debug 使用开发证书,Release 使用发布证书,两者对应的 App Group 权限都需要分别开通
更复杂的一点在于:同一个 group ID 在不同 target(例如主 App 和 Widget)中必须保持完全一致,大小写差异、前后空格、末尾斜杠等细节问题都可能导致配置失败;而 iOS 系统通常不会给出明确报错,只会静默降级为各自独立的沙盒环境。
