如何为 Xcode UI 测试禁用沙箱

How to disable sandbox for Xcode UI tests

对于我的 macOS 桌面应用程序的 UI 测试目标,我需要能够 运行 命令行工具(特别是 git)来验证一些应用程序操作,但我得到了一个应用程序沙盒中不能 运行 的错误。

我从来没有为我的应用程序或测试目标明确启用沙盒,所以我不知道如何关闭它。没有权利文件,我找不到任何似乎与沙盒相关的目标设置。

那么是否可以为 UI 测试目标禁用沙盒?我知道解决方法可能包括将 git 复制到捆绑包中,或者让用户明确 select 该工具,但这些似乎都不是真正可取的。

更新:我尝试将 git 复制到测试包到 运行,但仍然出现相同的错误。

更新 2:您可以关闭测试 bundle 的沙箱,但是测试 运行ner Xcode 自动构建仍然是沙盒(并且无法加载未签名的包),并且 AFAICT 无法更改 运行ner 的构建方式。我错了吗?

对我有用的修复方法是将 git 复制到包中,确保在构建期间对其进行代码签名。那么就可以从沙盒测试中运行运行ner.

要注意的是 /usr/bin/git 处的二进制文件 不是 真正的 git 工具,它是转发到 xcrun 的占位符在该应用程序包中找到您的活动 Xcode 安装和 运行s git 的副本,并且您不能在沙盒内执行任何操作。所以得直接从Xcode.

中复制出来

像这样:

  • 通过导航至 Xcode.app/Contents/Developer/usr/bin/git 并将位置弹出窗口设置为 "Relative to Developer Directory"
  • ,从 Xcode 添加 git
  • 将复制文件构建阶段添加到您的 UI 测试目标以将 git 复制到可执行文件目录中(如果您将其放在其他地方,则不会将代码签名为可执行文件)
  • 确保在构建阶段选中 "Code Sign on Copy"(这是默认设置)
  • 在运行时,使用Bundle(identifier: YourTestBundleID).url(forAuxiliaryExecutable: "git")
  • 找到git

创建 .entitlements 文件

<key>com.apple.security.app-sandbox</key> <false/>

并为您的 UI 测试包指定 CODE_SIGN_ENTITLEMENTS(通过 xcconfig 或构建设置 -> 签名)。 Xcode 将为测试运行器应用程序使用此权利的值。