我有一个由我制作的简单 unix 工具,可以从 shell 启动主要的可可应用程序。
我需要对其进行沙箱处理,但是当我运行它时,它会因错误“非法指令:4”而崩溃,在 console.app 上我可以看到以下错误消息
沙盒创建失败:容器对象初始化失败:NIL 容器信息对象没有 visdiff 的错误描述
该文件已使用 codesign 正确签名。
我读过这篇文章Mac OS app, sandbox with command line tool?但这无济于事
我有一个由我制作的简单 unix 工具,可以从 shell 启动主要的可可应用程序。
我需要对其进行沙箱处理,但是当我运行它时,它会因错误“非法指令:4”而崩溃,在 console.app 上我可以看到以下错误消息
沙盒创建失败:容器对象初始化失败:NIL 容器信息对象没有 visdiff 的错误描述
该文件已使用 codesign 正确签名。
我读过这篇文章Mac OS app, sandbox with command line tool?但这无济于事
我遇到了这个确切的问题,当我添加一个嵌入式 Info.plist 时它就消失了。
试试这些 clang 标志(假设你info.plist
在构建目录中有):
-Xlinker -sectcreate -Xlinker __TEXT -Xlinker __info_plist -Xlinker info.plist
控制台应用程序是直接从控制台启动还是从主沙盒应用程序调用?在尝试对某些二进制文件进行沙箱处理时,我收到了类似的错误,我只能通过仅使用以下权利使其工作:
<dict>
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.inherit</key>
<true/>
</dict>
当然,在那之后你只能从已经被沙盒化的父进程调用二进制文件(这就是为什么我问你的二进制文件是如何被调用的:))。
虽然@Nick Moore 的回答非常好,但在今天的 Xcode 中的 Packaging - Create Info.plist Section in Binary (CREATE_INFOPLIST_SECTION_IN_BINARY) 下有一个选项。所需要的只是将 thue 设置为 Yes。
似乎如果您使用 com.apple.security.inherit 签署可执行文件,则它只能由已被沙盒化的另一个应用程序调用。因此,在运行 codesign 后,您将无法再从 cmdline 调用它。