【问题标题】:Using a LaunchAgent inside the Mac app sandbox在 Mac 应用程序沙箱中使用 LaunchAgent
【发布时间】:2013-06-20 06:22:29
【问题描述】:

您将如何在沙盒中使用LaunchAgent?我想在我的主应用程序中分发一个无 UI 的 LaunchAgent 应用程序包,我可以按需启动它。我想要这个而不是 XPC 服务的原因是KeepAlive 选项,这将防止launchd 在空闲时自动杀死我的进程。 XPC 服务上不存在此选项。

文档说有一个 plist 需要复制到~/Library/LaunchAgents,这在沙箱中显然是不可能的。是否有某种系统 API 可以为我处理 plist 的复制?我看过 Apple 的 SMJobBless 示例代码,但这似乎是用于注册特权 LaunchDaemon 而不是非特权 LaunchAgent。

【问题讨论】:

    标签: macos cocoa launchd xpc launch-agent


    【解决方案1】:

    您要查找的 API 是 SMLoginItemSetEnabled()。您必须将长期运行的代理打包为常规的 .app 包,并将其放入主应用的包中,地址为 Content/Library/LoginItems

    然后在主应用程序运行时,您可以使用带有代理包标识符的SMLoginItemSetEnabled() 调用来启用和禁用您的代理。如果您的主应用程序退出,代理仍然存在。如果用户注销并重新登录或重新启动,操作系统将在用户重新登录时重新启动您的代理。

    更新:正如 Dmitry 所指出的,文档不再包含我最初提到的示例,但另一个 Apple sample code project,用于 App Sandbox,演示了相同的 API(请参阅文件 NSXPCConnection+LoginItem.m )。

    【讨论】:

    • 这种方法在 2020 年仍然可以用于 macOS Catalina 吗?
    【解决方案2】:

    文档页面现在不包含示例项目,所以这里是:http://rhult.github.io/articles/sandboxed-launch-on-login/

    【讨论】:

      猜你喜欢
      • 2012-03-19
      • 2011-02-14
      • 1970-01-01
      • 2012-08-03
      • 1970-01-01
      • 2016-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多