objective-c – 在macOS中以编程方式启用,禁用和启动服务

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

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

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

最佳答案 Apple有一个弃用的C API,用于在launch.h中启动,停止和启用launchd服务. 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 man pagesDaemons and Services Programming Guide一个非常接近的研究. Launchd可以启动您的流程以响应几乎任何事情:计时器,套接字连接,添加到系统的设备等等.您实际上需要管理自己的服务是很少见的.我无法证实这一点,但我怀疑这就是为什么他们已经弃用了API.

点赞