如何为 Xcode UI 测试禁用沙箱

Posted

技术标签:

【中文标题】如何为 Xcode UI 测试禁用沙箱【英文标题】:How to disable sandbox for Xcode UI tests 【发布时间】:2019-11-12 17:50:00 【问题描述】:

对于我的 macOS 桌面应用程序的 UI 测试目标,我需要能够运行命令行工具(特别是 git)来验证某些应用程序操作,但我收到无法在应用程序沙箱中运行的错误。

我从未为我的应用或测试目标明确启用沙盒,因此我无法弄清楚如何将其关闭。没有权利文件,我找不到任何似乎与沙盒相关的目标设置。

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

更新:我尝试将 git 复制到测试包中以从那里运行,但仍然遇到相同的错误。

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

【问题讨论】:

【参考方案1】:

创建 .entitlements 文件

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

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

【讨论】:

您能否阐明如何为 UITests-Runner 目标(而不是目标应用程序)执行此操作?正如@Uncommon 所说,似乎没有办法为 UITests-Runner 指定权利,因此明确禁用沙箱。 忽略我 - 我错过了当您将过滤器从“自定义”设置切换到“全部”设置时显示它。【参考方案2】:

对我有用的修复方法是将 git 复制到包中,确保它在构建过程中经过代码签名。然后它可以从沙盒测试运行器中运行。

问题是/usr/bin/git 的二进制文件不是真正的 git 工具,它是一个占位符,转发到 xcrun,它会找到您的活动 Xcode 安装并在其中运行 git 的副本应用程序包,您不能在沙箱内执行任何操作。所以你必须直接从Xcode中拷贝出来。

像这样:

通过导航到 Xcode.app/Contents/Developer/usr/bin/git 并将位置弹出窗口设置为“相对于开发人员目录”从 Xcode 添加 git 将 Copy Files 构建阶段添加到您的 UI 测试目标中,以将 git 复制到 Executables 目录中(如果您将其放在其他位置,它不会将代码签名为可执行文件) 确保在该构建阶段选中“复制代码签名”(这是默认设置) 在运行时,使用Bundle(identifier: YourTestBundleID).url(forAuxiliaryExecutable: "git")找到git

【讨论】:

以上是关于如何为 Xcode UI 测试禁用沙箱的主要内容,如果未能解决你的问题,请参考以下文章

沙箱机制(Sandboxie)

贝宝沙箱不工作[重复]

全网首发:(解决办法)MAC OS Xcode给应用设置沙箱(Enable App Sandbox)之后,运行报错Illegal instruction: 4

全网首发:(解决办法)MAC OS Xcode给应用设置沙箱(Enable App Sandbox)之后,运行报错Illegal instruction: 4

如何使用 Xcode 编译 C 程序,以便在沙箱中使用二进制文件?

沙箱测试