【问题标题】:How to call shell scripts to manage LaunchAgents from a sandboxed macOS application?如何从沙盒 macOS 应用程序调用 shell 脚本来管理 LaunchAgent?
【发布时间】:2020-02-07 16:24:20
【问题描述】:

我有一个非沙盒化的 macOS 应用程序,它通过以下方法愉快地调用其资源包中的 shell 脚本:

class func runShell(launchPath: String, arguments: [String] = [], waitUntilExit: Bool) -> Void {
    let task = Process()
    task.launchPath = launchPath
    task.arguments = arguments

    let pipe = Pipe()
    task.standardOutput = pipe
    task.launch()

    if waitUntilExit {
        task.waitUntilExit()
    }
}
ABCProcessManager.runShell(launchPath: scriptPath.path, arguments: ["-workingdirectory", path], waitUntilExit: true)

我正在尝试将应用程序转换为沙盒应用程序(用于 App Store 上传),但它在调用脚本时会冻结。

脚本管理一个启动代理。加载、卸载、启动、停止。

我需要如何更改我的代码才能使其在沙盒开启的情况下工作?也许有一种管理启动代理的“沙盒方式”?

【问题讨论】:

  • 我不认为你可以,这几乎会破坏沙盒的全部意义。不过,我认为您可以为此类事情提供特权 XPC 服务

标签: swift macos appstore-sandbox


【解决方案1】:

我在 Apple 工作人员发布的 Apple 支持论坛上找到了答案:

Mac App Store 中是否有可以运行的应用程序 使用 LaunchAgent?

没有。

为什么不:

  1. 应用中包含的 XPC 服务仅适用于该应用。
  2. Mac App Store 应用不得包含 launchd 守护程序或代理。

他们还提到技术上存在一种未记录的方式,但强烈建议不要走这条路:

作为实现的一个意外,服务注册了一个 沙盒兼容的登录项对运行的其他进程可见 用户的会话。因此,在当前系统上,您可以完成这项工作 通过实现与沙盒兼容的登录项(如 AppSandboxLoginItemXPCDemo 示例代码)并拥有您的命令行 工具与之对话。这种方法的问题在于它是一个 实现的意外而不是记录的功能。 此外,它与 App Sandbox 的一般目标背道而驰,即 沙盒应用应与系统的其余部分隔离。

所以我想我会坚持使用直接分发给客户的非沙盒应用程序。

Apple support post link

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    • 2013-06-20
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    • 1970-01-01
    相关资源
    最近更新 更多