【问题标题】:Unable to use NSTask to write using Sandbox无法使用 NSTask 使用 Sandbox 编写
【发布时间】:2017-05-22 18:28:50
【问题描述】:

我很难调试 NSTask 的问题。

我使用以下命令启动 NSTask:

NSTask *convTask = [[NSTask alloc] init];
[convTask setLaunchPath:[[NSBundle mainBundle] executablePath]];
[convTask setArguments: [NSArray arrayWithObjects: @"convTask", source, target, nil]];
[convTask launch];
[convTask waitUntilExit];
[convTask terminate];

所以它基本上是在启动一个任务,它是我正在运行的应用程序的另一个实例。此任务应该将 source(一个文件)转换为 target(另一个文件)。这仅在激活沙盒时才起作用。但即使在沙盒模式下,当我使用我的终端使用传递给 NSTask 的相同参数执行应用程序时,也会创建 target

感谢您的帮助!

【问题讨论】:

  • 控制台是否显示任何有关 sandboxd 的消息?
  • 没有没有消息

标签: macos nstask appstore-sandbox code-signing-entitlements


【解决方案1】:

根据Entitlement Key Reference

如果您的应用使用通过 posix_spawn 函数或 NSTask 类创建的子进程,您可以将子进程配置为继承其父进程的沙箱。

和:

要启用沙盒继承,子目标必须使用两个应用沙盒授权密钥:com.apple.security.app-sandbox 和 com.apple.security.inherit。如果您指定任何其他 App Sandbox 权利,系统将中止子进程。

我怀疑分叉自己不会是一个成功的策略,因为这意味着父进程必须只有这两个权利,这在子进程中不会很有用。

【讨论】:

  • 我已尝试将这两个权利添加到我的应用程序中,但没有任何改进。
  • 正如它所说,如果您有任何其他权利,子进程将简单地中止,如果您没有其他权利,您将无权写入文件。根据文档,我看不出您当前的架构如何工作。
猜你喜欢
  • 2014-08-04
  • 2015-03-12
  • 2019-12-15
  • 2022-01-17
  • 2016-10-01
  • 1970-01-01
  • 2016-01-30
  • 2017-09-02
  • 1970-01-01
相关资源
最近更新 更多