4

文档指出,使用SMJobBless您只能使用kSMDomainSystemLaunchd

SMJobBless(kSMDomainSystemLaunchd, (CFStringRef)label, authRef, (CFErrorRef *)error);

但是如何在用户库中的 LaunchAgents/ 中创建一个 LaunchAgent,使用 SMJobBless 或类似方法在用户登录时执行?

4

1 回答 1

2

这是一个老问题,但也许有人有同样的问题。

添加代理有两种主要方法:使用系统 API(ServiceManagement框架)或命令行工具(launchctl)。

使用 API

SMJobBless创建一个守护进程——进程,在 root 下运行。如果您希望创建一个代理进程,在另一个用户下运行,请使用该SMLoginItemSetEnabled功能。这些功能之间存在细微差别:

  1. SMJobBless注册一个可执行文件并SMLoginItemSetEnabled接受 bundle id 作为主要参数,因此对于代理,您需要创建一个 Cocoa 应用程序。

  2. SMLoginItemSetEnabled设置起来容易得多。

  3. SMJobBless将可执行文件复制到Library/PrivilegedHelperTools并从那里启动它,而不是从您的包中。SMLoginItemSetEnabled从您的捆绑包中启动代理,而不复制它。

  4. SMJobBless要求用户输入管理员密码;SMLoginItemSetEnabled不会用任何东西打扰用户,它不需要root权限。

使用启动ctl

SMLoginItemSetEnabled仅为当前用户注册代理。如果您需要添加一个代理,它将为任何登录的用户自动启动,请将配置.plist文件放入/Library/LaunchAgents(您需要 root 权限才能执行此操作)。为了立即加载它,请使用launchctl工具(来自代码-via NSTask)。有关配置文件的文档:man launchd.plist.

于 2019-01-07T06:37:00.437 回答