MacOs SandBox 杀死外部进程

问题描述 投票:0回答:1

问题涉及沙箱和主进程之外的进程执行。它是一个桌面应用程序(在 Unity 中创建),在执行时需要执行另一个进程(使用另一种技术创建的可执行文件)。主应用程序通过套接字与移动应用程序通过第二个进程交换数据,该进程充当本地服务器。

我在 Unity 中构建了项目,创建了 xCode 项目,并在 xCode 中输入了我的所有开发者帐户详细信息。我还添加了 Hardened Runtime 属性,到目前为止,一切都运行良好。应用程序启动,第二个进程(服务器)也被执行,我可以与移动应用程序连接并交换数据。然而,当我尝试在 Mac App Store 上发布它时,我收到一条警告,提示我还需要启用沙盒。我回到项目并启用沙盒属性以及两个网络检查(传入连接服务器/客户端)。

此时,我运行了测试,但充当服务器的第二个应用程序似乎被执行,然后立即被沙箱“杀死”。

外部申请是这样签署的:

codesign -f -s "DeveloperID Application: XXX" --entitlements entitlements.plist -o runtime externalApplicationName

权利.plist:

com.apple.security.cs.allow-jit = true com.apple.security.cs.allow-unsigned-executable-memory = true

提前致谢!

xcode macos unity-game-engine appstore-sandbox
1个回答
0
投票

我设法让它发挥作用。如果有人遇到同样的问题,我会分享解决方案。

  1. 将 SandBox 添加到父目标并选中应用程序使用的框(传入连接、硬件、应用程序数据或文件访问)。

  2. 如果在最终构建中缺少子进程,请使用“复制文件阶段”将其添加到您选择的文件夹中(据我了解,建议将其放置在框架中,但我不确定)。

  3. 在父进程的主文件中运行该进程。我使用了 posix_spawn(),但如果你使用 Swift,你应该使用 NSTask。

  4. 使用 codesign 手动签署子可执行文件,添加 SandBox 并使其继承父可执行文件。 (com.apple.security.app-sandbox,com.apple.security.inherit)

  5. 使用 Xcode 进行构建。

可能有更简洁的方法来实现同样的事情,但通过这种方式,我设法将其上传到 Mac App Store。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.