ユーザーがログインしたときに実行するようにMacOSXでアプリケーションバンドルをプログラムで設定するにはどうすればよいですか?
基本的に、HKCU\Software\Microsoft\Windows\CurrentVersion\Run
Windowsのレジストリキーに相当します。
アプリケーションをユーザーの「ログイン項目」(System Preferences=>Accounts=[user] の下) に追加するか、launchdエージェントをユーザーの~/Library/LaunchAgents
フォルダーに追加できます (「 」を参照man launchd.plist
)。~/Library/LaunchDaemons/
アプリにユーザー向け UI がない場合に使用します。他の人が指摘しているように、launchd を使用すると、アプリの起動時、アプリが終了またはクラッシュした場合の動作などを細かく制御でき、「デーモン」スタイルのアプリ (UI なし) に最も適しています。
最初のオプション (ログイン項目) は、プログラムで操作できます ( Gordonからのリンク)。
以下の作業例。
ファイルを作成する
~/Library/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
こちらもご覧ください
これは、「ログイン項目」を使用してアプリケーションをスターアップに追加するもう 1 つの方法です。実装方法については、このサンプル プロジェクトを参照してください。
「正しい」方法は、ログイン時に開始したいプロセス用の LaunchAgent を作成することです。このプロセスには UI があり、純粋なバックグラウンド プロセスであるべきプロセス用の LaunchDaemon があります。インストーラーで、ユーザー、すべてのユーザー、またはシステムのいずれかの正しいフォルダーに plist をドロップします。この方法が優れている理由は、launchd を使用してプロセスの実行方法を制御できるためです。たとえば、プロセスがクラッシュしたり、ユーザーによって強制終了されたりした場合でもプロセスが実行され続けるようにする組み込み機能が含まれます。
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");
}