在Mac OS X上以编程方式在启动时运行?

时间:2010-07-28 23:38:22

标签: macos autorun

如何以编程方式在Mac OS X上设置应用程序包,以便在用户登录时运行?

基本上,相当于Windows中的HKCU\Software\Microsoft\Windows\CurrentVersion\Run注册表项。

4 个答案:

答案 0 :(得分:17)

您可以将应用程序添加到用户的“登录项”(在系统偏好设置=>帐户= [用户]下),也可以将launchd代理添加到用户的~/Library/LaunchAgents文件夹中(请参阅man launchd.plist)。如果您的应用没有面向用户的用户界面,请使用~/Library/LaunchDaemons/。正如其他人所指出的,launchd让你可以控制应用程序何时启动,如果应用程序退出或崩溃会发生什么等等,并且最适合“守护进程”风格的应用程序(我们没有用户界面)。

可以操作第一个选项(登录项)programmatically(来自Gordon的链接)。

答案 1 :(得分:6)

“正确”的方法是为要在登录时启动的进程创建一个LaunchAgent,这些进程可能具有UI和适用于纯后台进程的LaunchDaemon。 在安装程序中,将plist放入正确的文件夹中,无论是为用户,还是为所有用户或系统。这种方法优越的原因是因为你可以使用launchd控制进程的运行方式,包括内置的能力,即使它崩溃或被用户杀死,也能确保它继续运行。

答案 2 :(得分:5)

下面的工作示例。

创建文件

〜/库/ LaunchAgents / my.everydaytasks.plist

内容:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>my.everydaytasks</string>
    <key>ProgramArguments</key>
    <array>
        <string>/Applications/EverydayTasks.app/Contents/MacOS/EverydayTasks</string>
    </array>
    <key>ProcessType</key>
    <string>Interactive</string>
    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
    <false/>
</dict>
</plist>

请参阅帮我制作此示例的原始帖子:

https://superuser.com/a/229792/43997

要测试你需要在终端

中运行它
launchctl load -w ~/Library/LaunchAgents/my.everydaytasks.plist

卸载

launchctl unload -w ~/Library/LaunchAgents/my.everydaytasks.plist

另见

https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man5/launchd.plist.5.html

这是使用“登录项”将应用程序添加到starup的另一种方法。请参阅此示例项目,了解如何实现它:

https://github.com/justin/Shared-File-List-Example

答案 3 :(得分:3)

对于使用Qt / C ++的人来说,想把它扔出去。 Qt使得通过QSettings类使用plist非常容易。从示例虚拟应用程序中查看此代码段。

void MainWindow::readPlist()
{
    QSettings settings(appPlistPath, QSettings::NativeFormat);
    QVariant value = settings.value("mykey");
    QMessageBox::information(this, "Your Value", value.toString());
}

void MainWindow::addPlistEntry()
{
    QSettings settings(appPlistPath, QSettings::NativeFormat);
    settings.setValue("mykey", "myvalue");
}

void MainWindow::removePlistEntry()
{
    QSettings settings(appPlistPath, QSettings::NativeFormat);
    settings.remove("mykey");
}