如何为 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 测试禁用沙箱的主要内容,如果未能解决你的问题,请参考以下文章
全网首发:(解决办法)MAC OS Xcode给应用设置沙箱(Enable App Sandbox)之后,运行报错Illegal instruction: 4
全网首发:(解决办法)MAC OS Xcode给应用设置沙箱(Enable App Sandbox)之后,运行报错Illegal instruction: 4