Skip to content

Xcode 沙盒文件写入权限错误解决

问题描述

在使用 Xcode 构建 React Native 的 Share Extension 时,常常会遇到如下沙盒权限错误:

Sandbox: bash(72986) deny(1) file-write-data /Users/XXX/ios/Pods/resources-to-copy-XXXShareExtension.txt

这个错误表明 Xcode 的沙盒机制阻止了构建过程中对指定文件的写入操作。典型症状包括:

  • 构建过程因权限问题中断
  • 错误信息中包含 deny(1) file-write-data 或类似表述
  • 错误可能发生在主应用或扩展目标(如 Share Extension)
  • 在 React Native、Ionic 或使用 SwiftLint 的 iOS 项目中常见

该问题在 Xcode 15 及以上版本中尤为常见,沙盒机制加强了文件访问限制。

WARNING

即使您重建项目多次,这个沙盒权限错误通常也不会自动消失,需要手动修改构建设置

解决方案

方法1:禁用用户脚本沙盒(主解决方案)

这是被验证最有效的通用解决方案:

  1. 在 Xcode 中打开项目
  2. 选择报错对应的目标(主应用或扩展目标)
  3. 前往 Build Settings 标签页
  4. 在搜索框中输入 ENABLE_USER_SCRIPT_SANDBOXING
  5. 将对应设置从 Yes 改为 No

Xcode 中的 ENABLE_USER_SCRIPT_SANDBOXING 设置位置

TIP

必须为所有相关目标执行此操作:

  • 主应用目标
  • Share Extension 目标
  • 其他可能的扩展目标

方法2:解决 CI 环境特定问题(React Native 项目)

若错误出现在 CI/CD 管道中且项目使用 React Native:

ruby
# 在 Gemfile 中添加
gem 'xcodeproj', '<1.26.0'

执行以下命令应用变更:

bash
bundle install

此问题由 xcodeproj gem v1.26.0+ 的更新引起,降级可临时解决沙盒兼容性问题。

替代方案:检查文件读取权限(SwiftLint场景)

当错误类型为 file-read-data 时(常见于 SwiftLint):

bash
# 终端检查文件权限
ls -l /Users/YourName/YourProjects/Pods/SwiftLint/swiftlint

# 若无读取权限,尝试修改
chmod +r /Users/YourName/YourProjects/Pods/SwiftLint/swiftlint

原理说明

Xcode 15 引入的强化沙盒机制(ENABLE_USER_SCRIPT_SANDBOXING)限制了构建过程中脚本的文件访问权限:

  1. 第三方构建脚本(如 CocoaPods、SwiftLint)触发沙盒拦截
  2. file-write-data 表示脚本尝试写入文件被阻止
  3. React Native 的 Share Extension 构建流程常因路径权限不足失败

禁用沙盒选项本质上是降低安全性换取兼容性,确保:

  • CocoaPods 能正常复制资源文件
  • 构建脚本有足够权限执行操作
  • 工具链能访问必要的临时目录

:::caution 安全提示 禁用沙盒仅建议在信任的代码基础上使用。若您的脚本来源不明,请先审核脚本再禁用沙盒 :::

补充建议

  • 清理构建缓存:修改设置后执行 Xcode > Product > Clean Build Folder
  • 检查路径空白符:路径中的空格(如 /Users/Your Name/)可能导致某些工具异常
  • 验证多目标设置:确保主应用和扩展目标都完成相同配置
  • 更新工具链:定期升级 CocoaPods、Node 模块和 Gem 包可预防兼容问题

此解决方案已验证适用于: ✅ React Native Share Extension
✅ Ionic 项目中的 file-read-data 错误
✅ SwiftLint 文件访问问题
✅ Xcode 15+ 各小版本

TIP

通过命令行构建的 CI 环境可能出现特殊问题,优先尝试方法2的降级解决方案