I need a way to add an application to the Login Items from a postflight script which is run as part of my installer. It needs to work on 10.5+. Preferably, it would work in a bash script. My application already requires administrative rights.
The approach I found here: Mac OS Login Items with Arguments? seemed to be on the right track (included below)... but didn't work when I tried it on command line and I'm not sure how to make it install for All Users or if I need to add logic to check if it's already added to startup items before calling this code.
#!/bin/bash
/usr/bin/osascript -e "tell application \"System Events\" to make new login item with properties { path: \"$1\", hidden:false } at end"
I suspect I could also do something with a launchd. But, I'm not sure which approach is the best practice for compatibility across versions.
NOTE: I do NOT want to add it using some objective-c code inside my app. I need the installer to add it. Currently, what I do is start the application after install which then Adds it to Login Items in code using the LSSharedFileListRef... Example of that approach can be found here: How do you make your App open at login?. The reason this is not ok is I need to make my application install with Apple Remote Desktop via command line, when on the login screen. So, the application needs to not start automatically after install.
Here's the options I investigated and experimented with:
This is the method I used. It's very easy to do from a bash file by adding the following line to your postflight.
defaults write /Library/Preferences/loginwindow AutoLaunchedApplicationDictionary -array-add '{Path="/Applications/Your Application.app";}'
Note: You don't even have to worry about adding duplicates if you reinstall the application. The loginwindow process removes duplicates when it reads them.
I tested this on 10.5, 10.6, and 10.7
@noa says this doesn't work on mountain lion (10.8), Haven't personally confirmed.
The unique ramifications of using a Launch Agent are:
Here's some code you could use to create the launch agent in your bash file:
cat > /Library/LaunchAgents/com.your.application.agent.plist << EOT
<?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>com.your.application.agent</string>
<key>ProgramArguments</key>
<array>
<string>/Applications/Your Application.app/Contents/MacOS/Your Application</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
EOT
I never actually finished this approach. Apparently, this is the approach that Novell takes. Essentially you'd make a foundation application that calls the libraries referenced from this solution: How do you make your App open at login?
Didn't try this but according to this post if you want it to work on tiger you need to use AppleScript..? I can't confirm or deny that but thought this link might be relevant. Editing Mac OS X login items in Objective-C through AppleScript