6

我正在编写一个附带服务的程序。到目前为止,我所做的是创建一个帮助工具,它可以为我的进程运行提升的任务,并可以通过 XPC 进行通信。

我的程序与服务捆绑在一起,我想使用帮助工具来安装和启动/停止此服务,以便我的程序可以在设置中有一个复选框“使用系统启动服务”。

我可以成功复制服务的 plist,但我找不到任何方法来以编程方式启用、禁用、启动或停止服务。我认为调用的解决方案system("launchctl load /path/to/service.plist");非常丑陋。目标 C 中是否有任何机制来完成此任务并获得成功或失败的结果?

4

2 回答 2

3

Apple 有一个已弃用的 C API,用于在launch.h. API 的源代码在他们的开源网站上:https ://opensource.apple.com/source/launchd/launchd-442.26.2/liblaunch/

下面是一些要求 launchd 启动 LittleSnitchUIAgent 服务的示例代码:

#include <launch.h>

int main(int argc, const char * argv[]) {
    const char *job = "at.obdev.LittleSnitchUIAgent";
    launch_data_t resp, msg;
    msg = launch_data_alloc(LAUNCH_DATA_DICTIONARY);
    launch_data_dict_insert(
        msg, launch_data_new_string(job), LAUNCH_KEY_STARTJOB);
    resp = launch_msg(msg);
    launch_data_free(msg);
    return 0;
}

LittleSnitchUIAgent 没有意义——我是从本地服务列表中随机选择的。我离开了样本的错误检查以使其保持直截了当。

如果您还没有,我建议您仔细研究launchd 手册页守护进程和服务编程指南。Launchd 可以启动您的进程以响应几乎任何事情:计时器、套接字连接、添加到系统的设备等等。您实际上很少需要管理自己的服务。我无法确认这一点,但我怀疑这就是他们弃用 API 的原因。

于 2017-08-20T17:27:35.787 回答
1

看起来有一个用于加载 LaunchAgent的ServiceManagement API/框架。看起来SMJobBless是唯一可用的方法

于 2019-01-05T22:14:32.687 回答