文档指出,使用SMJobBless您只能使用kSMDomainSystemLaunchd
SMJobBless(kSMDomainSystemLaunchd, (CFStringRef)label, authRef, (CFErrorRef *)error);
但是如何在用户库中的 LaunchAgents/ 中创建一个 LaunchAgent,使用 SMJobBless 或类似方法在用户登录时执行?
文档指出,使用SMJobBless您只能使用kSMDomainSystemLaunchd
SMJobBless(kSMDomainSystemLaunchd, (CFStringRef)label, authRef, (CFErrorRef *)error);
但是如何在用户库中的 LaunchAgents/ 中创建一个 LaunchAgent,使用 SMJobBless 或类似方法在用户登录时执行?
这是一个老问题,但也许有人有同样的问题。
添加代理有两种主要方法:使用系统 API(ServiceManagement
框架)或命令行工具(launchctl
)。
使用 API
SMJobBless
创建一个守护进程——进程,在 root 下运行。如果您希望创建一个代理进程,在另一个用户下运行,请使用该SMLoginItemSetEnabled
功能。这些功能之间存在细微差别:
SMJobBless
注册一个可执行文件并SMLoginItemSetEnabled
接受 bundle id 作为主要参数,因此对于代理,您需要创建一个 Cocoa 应用程序。
SMLoginItemSetEnabled
设置起来容易得多。
SMJobBless
将可执行文件复制到Library/PrivilegedHelperTools
并从那里启动它,而不是从您的包中。SMLoginItemSetEnabled
从您的捆绑包中启动代理,而不复制它。
SMJobBless
要求用户输入管理员密码;SMLoginItemSetEnabled
不会用任何东西打扰用户,它不需要root权限。
使用启动ctl
SMLoginItemSetEnabled
仅为当前用户注册代理。如果您需要添加一个代理,它将为任何登录的用户自动启动,请将配置.plist
文件放入/Library/LaunchAgents
(您需要 root 权限才能执行此操作)。为了立即加载它,请使用launchctl
工具(来自代码-via NSTask
)。有关配置文件的文档:man launchd.plist
.