2010-07-28 6 views
14

Wie programmiere ich programmgesteuert ein Anwendungspaket unter Mac OS X, das ausgeführt wird, wenn sich der Benutzer anmeldet?Programmgesteuert beim Start unter Mac OS X?

Im Grunde das Äquivalent der HKCU\Software\Microsoft\Windows\CurrentVersion\Run Registrierungsschlüssel in Windows.

Antwort

14

Sie können die Anwendung auf den „Login Items“ (unter Systemeinstellungen => Konten = [user]) des Benutzers hinzufügen oder Sie können ein launchd Mittel auf den ~/Library/LaunchAgents Ordner des Benutzers hinzugefügt werden (siehe man launchd.plist). Verwenden Sie ~/Library/LaunchDaemons/, wenn Ihre App keine Benutzeroberfläche für Nutzer enthält. Wie andere darauf hinweisen, gibt launchd Ihnen eine Menge Kontrolle darüber, wann die App startet, was passiert, wenn die App beendet wird oder abstürzt, usw. und am besten für "Daemon" -Apps geeignet ist (mit unserer ohne UI).

Die erste Option (Login Items) kann manipuliert werden programmatically (Link von Gordon).

+0

Könnten Sie vielleicht auf auszuarbeiten, wie ich das mit Apple tun könnte? (oder C++) –

+3

Apples [Entwickler zum Thema] (http://developer.apple.com/mac/library/documentation/MacOSX/Conceptual/BPSystemStartup/Articles/CustomLogin.html) beschreiben 3 Methoden zum Hinzufügen eines Login Items , mit einem Code-Snippet für einen und einem Link zum Beispiel-Code für einen anderen. –

+0

ein Beispiel für Plist-Datei und wie Sie es hinzufügen wäre sehr hilfreich – Dmitriy

5

Die "richtige" Methode besteht darin, einen LaunchAgent für Prozesse zu erstellen, die bei der Anmeldung gestartet werden sollen und die eine UI und einen LaunchDaemon für diejenigen haben, die reine Hintergrundprozesse sein sollen. In Ihrem Installer legen Sie Ihren Plist in den richtigen Ordner, entweder für den Benutzer oder alle Benutzer oder das System. Der Grund, warum diese Methode überlegen ist, ist, dass Sie mit launchd steuern können, wie Ihr Prozess ausgeführt wird, einschließlich der eingebauten Fähigkeit, um sicherzustellen, dass sie auch dann weiterläuft, wenn sie abstürzt oder vom Benutzer getötet wird.

+0

Dies ist keine kritische Anwendung, die * muss * ausgeführt werden muss, es ist nur für eine bequeme Option im Dialogfeld Einstellungen. Sagen Sie, dass die Anwendung weiterhin ausgeführt wird, wenn Benutzer sie beenden? Ich möchte nicht, dass das passiert. –

+0

Nein, das ist eine Option, wenn Sie LaunchDaemons verwenden. Sie können auswählen, wie das System Ihre Anwendung ausführen soll. – Jeremy

3

Wollte das hier für jeden herausbringen, der Qt/C++ benutzt. Qt macht es sehr einfach, plists durch die QSettings-Klasse zu verwenden. Überprüfen Sie dieses Code-Snippet anhand einer Beispiel-Dummy-Anwendung.

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"); 
} 
4

Ein Arbeitsbeispiel unten.

Erstellen Sie eine Datei

~/Library/Launchagents/my.everydaytasks.plist

Mit Inhalt:

<?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> 

die Original-Beitrag ansehen, die mir geholfen, diesem Beispiel zu machen:

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

Zu tes t Sie dies in Terminal

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

entladen

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

Siehe auch

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

Die laufen müssen, ist die andere Art und Weise der Anwendung der Zugabe mit „Login Items to Starup ". Sehen Sie dieses Beispiel Projekt, wie es zu implementieren:

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

+0

Angenommen, ich habe einen Parameter der .list-Datei als dynamischen Wert, der im Moment der Anwendungsinstallation generiert wird. Wie kann ich es weitergeben/senden? – mthama