iOS端uni-app需手动配置AppGroup:在Xcode中添加Capability、创建并关联.entitlements文件,设置正确group ID(如group.com.yourcompany.yourapp),否则NSUserDefaults和文件共享失效。
uni-app iOS端无法通过配置项自动启用AppGroup,必须手动修改原生工程并配置entitlements文件,否则NSUserDefaults、NSFileManager等跨进程共享行为全部失效。
打包出ios_build目录后,用Xcode打开unpackage/res/ios/xxx.xcworkspace(不是.xcodeproj),在Project Navigator选中项目根节点 → Signing & Capabilities → “+ Capability” → 搜索并添加App Groups。添加后勾选对应group,格式必须为group.com.yourcompany.yourapp,不能带空格或下划线开头。
常见问题表现:
Failed to get shared container URL:entitlements未生效或bundle ID与provisioning profile不匹配使用场景:仅当需要在主App与Today Extension、Widget、Share Extension或后台Service之间共享NSUserDefaults或文件时才必须启用;纯App内多进程(如IM SDK子进程)也依赖此配置。
uni-app默认不生成.entitlements文件,需手动创建并关联到Target:
xxx.entitlements(xxx为target名)com.apple.security.application-groups,Type设为Array,Item 0填入完整group ID(如group.com.yourcompany.yourapp)xxx.entitlements
注意:HBuilderX 4.20+ 版本会在打包时尝试注入entitlements,但若Xcode中未显式指定,实际构建仍会忽略;务必以Xcode界面中显示的Entitlements File路径为准。
不能直接用uni.getStorageSync或plus.storage,它们只作用于当前进程沙盒。必须调用原生API桥接:
NSUserDefaults.alloc().initWithSuiteName('group.com.yourcompany.yourapp')
synchronize(),否则其他进程可能读不到最新值NSFileManager.defaultManager().containerURLForSecurityApplicationGroupIdentifier获取,而非NSHomeDirectory()
性能影响:跨进程访问UserDefaults有明显延迟(iOS 17实测平均8–15ms),高频写入建议改用文件+watcher机制,或用NSCache做本地缓存层。
最容易被忽略的是权限校验环节:
po NSFileManager.defaultManager().containerURLForSecurityApplicationGroupIdentifier("group.com.yourcompany.yourapp"),返回nil即失败复杂点在于:同一group ID在不同target(如主App和Widget)中必须使用完全一致的字符串,大小写、前后空格、末尾斜杠都会导致失败;且iOS系统不会给出明确提示,只会静默降级为独立沙盒。