在mac系统的sandbox环境下,要设置开机启动就不能使用sharedFileList,apple公司推介使用helper小程序来启动主程序。

实现的简要步骤:
1、在xcode中设计一个简单的Cocoa程序,姑且命名为BootLaunchHelper;
2、设置helper程序的参数:
Build Settings>Skip Install属性设置为 YES;
Info>Custom OS X Application Target Properties>Application is agent(UI Element)属性设置为YES;
Info>Custom OS X Application Target Properties>Application is background only属性设置为YES.
3、在主程序中,将helper程序打包到主程序的Contents/Library/LoginItems目录下.
3.1 在xcode主程序中,需要在Build Phases中新建Copy Files属性,然后设置属性:
Copy Files>Destination : Wrapper
Copy Files>Subpath : Contents/Library/LoginItems
添加xxxhelper程序。这样在build你的主程序时就可以直接将helper程序打包进指定的目录。
3.2 在xcode主程序中还需要引用系统包,在Build Phases>Link Binary With Libraries中添加系统库ServiceManagement.framework.
头文件中包含ServiceManagement/ServiceManagement.h文件。
3.3 在Qt程序中,可以将设置函数封装为Library,同样在Library中也要和主程序一样的设置。
4、注册helper程序为开机启动程序
以下代码放在xcode主程序设置开机启动的地方,或Qt程序设计开机启动的调用Library中。

    // 注册启动程序路径到ServerManage
    OSStatus res = LSRegisterURL((__bridge CFURLRef)[NSURL fileURLWithPath:helperPath], true);
    if (res != noErr) {
        NSLog(@"Regist launch app failed.");
        return -2;
    // 设置或禁止启动程序开机启动
    if (!SMLoginItemSetEnabled((__bridge CFStringRef)appId, bEnable)) {
        NSLog(@"SetEnabled launch app failed.");
        return -3;

5、在Mac下由于注册使用路径和identify标志两种形式,如果在不同的path都注册了同样的identify程序,就会在ServiceManagement的path数据库添加多个启动程序,会导致系统可能找不到正确的启动路径。解决方法就是将多余的拷贝路径删除。
下面这行命令显示BootLaunchHelper.app程序所有可用的路径:

/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -dump|grep .*path.*BootLaunchHelper

删除多余的拷贝路径:

/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -kill -r -domain local -domain system -domain user
app  注册开机 启动 LSSharedFileListRef loginItems = LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL); //url为app所在的目录 CFURLRef url = (CFURLRef)[NSURL fileURLWithPath:
创建沙盒应用程序时, LSSharedFileListInsertItemURL不能再用于在启动启动该应用程序。 相反, SMLoginItemSetEnabled应该与启动主应用程序的主应用程序包中的帮助器应用程序一起使用。 LaunchAtLoginHelper是该帮助程序应用程序,它被设计为尽可能容易地集成到主应用程序中,以使其在沙盒登录时启动。 这个助手应用程序进行了大量研究。 例如, 指出应使用LSRegisterURL来注册助手应用程序,但是这似乎从未奏效,并且在进一步挖掘后发现,这是一个。 我在网上发现的许多示例都使用NSWorkspace launchApplication:来启动主应用程序,但是由于受到沙箱的限制,因此改用了url方案。 LaunchAtLoginHelper调用主应用程序的方案两次,一次与一次launchg的应用程序,然后launchedAtLog
大多数不用用户交互的任务都会通过一个运行在后台的进程高效处理。你可以将daemon或service用到: 提供服务器功能,例如服务web页。协同访问共享资源,如数据库。为前台应用程序工作,例如文件系统访问。 注意:该文档以前的标题是“系统启动编程指南”。
原文: http://www.skyfox.org/cocoa-sandbox-app-launch-at-login.html macOS app 开机启动虽然有很多种方法,但是在需要上架APPStore的情况下,访问沙盒外的文件会被拒绝. 苹果官方提供了两种方式: Service Management framework 和 shared file list There are two ways to add a login item: using the Service Management .
1.Login Items Mac OSX的当前用户成功登录后启动的程序,该类别的启动项配置文件存放在~/Library/Preferences/com.apple.loginitems.plist,所以只针当前用户,你可以通过以下方式进行设置: 1.在系统偏好设置的“用户与群组”下面进行设置,可以删除、添加、开启和关闭; 2.你可以直接修改~/Library/Preferenc
Mac下没有像Linux那样有很多的关于init方面的工具,从init的发展历史https://en.wikipedia.org/wiki/Init上可以知道,Mac使用的是Launchd作为init管理工具,对应的命令工具为launchctl。 如果在Linux下创建一个自启动服务可以使用Upstart、Systemd、Sysvinit,其中最简单和最古老的方式应该是Sy...