Skip to content

解决 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 项目:

  1. 在 Xcode 中打开 ios 文件夹下的工作空间(如 Runner.xcworkspace)
  2. 在顶部导航栏中选中项目名称
  3. 在左侧项目导航器中选择 Runner 目标
  4. 转到 Build Settings 标签页
  5. 在搜索框中输入 ENABLE_USER_SCRIPT_SANDBOXING
  6. 将此选项的值修改为 NO

关键步骤

  • 确保同时在 RunnerFlutter Assemble 目标中关闭该设置
  • 在 React Native 项目中还需检查 Pods 项目中的相同设置

方法 2:检查所有目标与扩展

如果项目包含通知扩展或其他子目标,需逐个检查设置:

bash
# 在终端中查看项目结构
$ ls -la ios/Runner.xcodeproj/project.pbxproj
  1. 在 Xcode 项目导航器中依次检查每个目标:
    • Runner
    • Flutter Assemble
    • 任何 Extension(如 CleverPushNotificationServiceExtension
  2. 对每个目标重复方法1的操作,确保所有 ENABLE_USER_SCRIPT_SANDBOXING=NO

常见遗漏

许多用户只修改了主目标而忽略扩展目标,这是导致方案失败的主要原因!

辅助解决方案

清理构建缓存

关闭沙盒后执行完整清理操作:

  1. 关闭 Xcode
  2. 终端中运行:
bash
# 清理 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
  1. 重新启动 Xcode 并构建项目

处理 CocoaPods 版本问题 (2024年10月后)

如果最近更新后出现此错误,可能是 xcodeproj gem 版本导致:

ruby
# 在 Gemfile 中添加
gem 'xcodeproj', '1.25.0'

执行以下操作:

bash
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 强制修改权限的方案:

bash
# 不推荐!可能引入安全风险
sudo chmod -R 777 /project_path

此方案会完全禁用系统安全机制,强烈建议采用官方设置方案

补充提示

  1. 项目结构变更后:添加新插件/扩展时,需重新检查沙盒设置
  2. 多开发环境协同:在团队中通过版本控制管理 pbxproj 文件修改
  3. 持续集成(CI):在 Jenkins/GitHub Actions 中确保沙盒设置被正确覆盖
  4. Xcode更新后:每次大版本更新需重新验证此设置

遵循上述方案,95%以上的 rsync.samba 写入错误都能解决。若仍有问题,建议:

  1. 复查所有目标设置
  2. 创建全新 Flutter 项目对比配置差异
  3. 在 GitHub 提交 flutter/flutter 问题报告