You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xcode Run Script无法写入项目源码目录,如何解决?

解决PlistBuddy无法写入$(SRCROOT)/$(PROJECT_NAME)目录的问题

核心原因分析

  • Xcode构建沙箱限制:当在Run Script中指定Output Files时,Xcode会启动构建沙箱,仅允许脚本写入你明确声明的输出路径。如果目标子目录未被沙箱授权,或者路径解析存在问题,就会触发"Operation not permitted"错误。
  • 目录存在性问题:如果$(SRCROOT)/$(PROJECT_NAME)目录因某种原因不存在,直接写入也会导致权限类报错。

具体解决步骤

1. 先确保目标目录存在

在执行PlistBuddy命令前,先添加创建目录的命令,避免因目录缺失导致的写入失败:

mkdir -p "$(SRCROOT)/$(PROJECT_NAME)"

2. 验证Output Files路径的正确性

确认Output Files栏填写的路径是绝对路径且变量解析正常:

$(SRCROOT)/$(PROJECT_NAME)/out.plist

可以在脚本开头添加打印语句验证路径:

echo "目标路径:$(SRCROOT)/$(PROJECT_NAME)/out.plist"

如果输出路径不符合预期,检查PROJECT_NAME变量在当前构建阶段是否正确赋值(比如CocoaPods项目中可能需要调整变量引用)。

3. 临时关闭构建沙箱(仅作排查用,不推荐长期使用)

如果前两步无效,可以尝试关闭Run Script的沙箱限制:

  • 选中Run Script阶段,取消勾选Run script only when installing(若已勾选)
  • 或者在Build Settings中搜索ENABLE_USER_SCRIPT_SANDBOXING,将其设为NO
    注意:关闭沙箱会降低构建安全性,仅作为临时排查手段,优先用前两种方法。

4. 替换PlistBuddy为Xcode友好的plist生成方式

如果PlistBuddy的权限问题难以解决,改用plutil结合模板文件的方式:

  • 先创建一个Template.plist模板文件:
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
        <key>SwiftFlags</key>
        <string></string>
    </dict>
    </plist>
    
  • 在Run Script中执行替换生成命令:
    plutil -replace SwiftFlags -string "$OTHER_SWIFT_FLAGS" "$(SRCROOT)/Template.plist" -o "$(SRCROOT)/$(PROJECT_NAME)/out.plist"
    

这种方式更贴合Xcode构建规范,权限问题更少。


内容的提问来源于stack exchange,提问作者Michael Gaines

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 16:57:08