解决 Xcode 中的 Sandbox: rsync.samba 文件写入失败错误
问题概述
在 Xcode 构建 iOS 应用程序(特别是 Flutter 或 React Native 项目)时,当遇到以下错误消息:
Sandbox: rsync.samba (13105) deny(1) file-write-create
Flutter failed to write to a file
这通常发生在 macOS Ventura/Sonoma 及以上版本(包括 macOS 14+),尤其在 Apple Silicon(M1/M2/M3)设备上。问题根源是 macOS 的安全沙盒机制限制了文件写入操作导致构建中断。
核心解决方案
方法 1:关闭用户脚本沙盒功能(推荐)
这是最有效的解决方案,适用于绝大多数 Flutter/React Native 项目:
- 在 Xcode 中打开
ios
文件夹下的工作空间(如Runner.xcworkspace
) - 在顶部导航栏中选中项目名称
- 在左侧项目导航器中选择 Runner 目标
- 转到 Build Settings 标签页
- 在搜索框中输入
ENABLE_USER_SCRIPT_SANDBOXING
- 将此选项的值修改为 NO
关键步骤
- 确保同时在 Runner 和 Flutter Assemble 目标中关闭该设置
- 在 React Native 项目中还需检查 Pods 项目中的相同设置
方法 2:检查所有目标与扩展
如果项目包含通知扩展或其他子目标,需逐个检查设置:
# 在终端中查看项目结构
$ ls -la ios/Runner.xcodeproj/project.pbxproj
- 在 Xcode 项目导航器中依次检查每个目标:
- Runner
- Flutter Assemble
- 任何 Extension(如
CleverPushNotificationServiceExtension
)
- 对每个目标重复方法1的操作,确保所有
ENABLE_USER_SCRIPT_SANDBOXING=NO
常见遗漏
许多用户只修改了主目标而忽略扩展目标,这是导致方案失败的主要原因!
辅助解决方案
清理构建缓存
关闭沙盒后执行完整清理操作:
- 关闭 Xcode
- 终端中运行:
# 清理 Flutter 缓存
flutter clean
flutter pub get
# 清理 iOS 构建文件
cd ios
pod deintegrate
rm -rf Pods
rm Podfile.lock
# 清理 Xcode 缓存
rm -rf ~/Library/Developer/Xcode/DerivedData
xcrun simctl delete unavailable
# 重新安装依赖
pod install
- 重新启动 Xcode 并构建项目
处理 CocoaPods 版本问题 (2024年10月后)
如果最近更新后出现此错误,可能是 xcodeproj gem
版本导致:
# 在 Gemfile 中添加
gem 'xcodeproj', '1.25.0'
执行以下操作:
bundle install
bundle exec pod install
版本注意事项
- 仅 Xcode 15 需要此操作,Xcode 16+ 应保持最新版本
- 或升级 CocoaPods:
gem install cocoapods -v '>=1.16.1'
解决方案原理
ENABLE_USER_SCRIPT_SANDBOXING
是 Apple 引入的安全功能,限制构建过程中的文件写入操作。当 Flutter/React Native 需要热重载或动态生成代码时,此限制会导致 rsync.samba
写入失败。
关闭此选项后,开发环境获得必要的文件系统权限,但:
- 只会影响本地开发构建
- 不影响 App Store 发布版本的安全性
- 不会降低运行时沙箱保护
替代方案(不推荐)
危险操作
避免使用 chmod 777
强制修改权限的方案:
# 不推荐!可能引入安全风险
sudo chmod -R 777 /project_path
此方案会完全禁用系统安全机制,强烈建议采用官方设置方案
补充提示
- 项目结构变更后:添加新插件/扩展时,需重新检查沙盒设置
- 多开发环境协同:在团队中通过版本控制管理
pbxproj
文件修改 - 持续集成(CI):在 Jenkins/GitHub Actions 中确保沙盒设置被正确覆盖
- Xcode更新后:每次大版本更新需重新验证此设置
遵循上述方案,95%以上的 rsync.samba
写入错误都能解决。若仍有问题,建议:
- 复查所有目标设置
- 创建全新 Flutter 项目对比配置差异
- 在 GitHub 提交 flutter/flutter 问题报告