从bash脚本添加应用程序到OSX“login项目”

我需要一种方法,通过作为安装程序的一部分运行的postflight脚本将应用程序添加到login项目中。 它需要工作在10.5+。 最好,它将工作在一个bash脚本。 我的申请已经需要pipe理权限。

我在这里find的方法︰https: //stackoverflow.com/questions/4912212/mac-os-login-items-with-arguments似乎是在正确的轨道(包括下面)…但没有工作,当我尝试它在命令行上,我不知道如何使它安装所有用户,或者如果我需要添加逻辑来检查它是否已经添加到启动项目调用此代码之前。

#!/bin/bash /usr/bin/osascript -e "tell application \"System Events\" to make new login item with properties { path: \"$1\", hidden:false } at end" 

我怀疑我也可以用launchd做些事情。 但是,我不确定哪种方法是跨版本兼容的最佳实践。

如果您不介意阅读,我build议从Apple技术说明TN2083:守护程序和代理开始 。

我还没有testing过,但我相信最简单的方法就是通过launchd代理来做你想做的事情。 这基本上涉及在/Library/LaunchAgents一个plist文件。 这样做的一个好处是你可以随意覆盖同一个文件,而且你不应该得到你的项目的多个实例(每个用户)。

就像是:

  #!/bin/sh cat > /Library/LaunchAgents/com.serverfault.myapp.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.serverfault.myapp</string> <key>ProgramArguments</key> <array> <string>/Library/MyApp/myapp.app/Contents/MacOS/myapp</string> </array> <key>RunAtLoad</key> <true/> </dict> </plist> EOT 

另一种可能性是全局login项目 。 从上面提到的技术笔记中,我收集到:

  • 全局login项目是任何用户login时启动的login项目。
  • 在Mac OS X 10.5及更高版本中,您可以使用共享文件列表界面将启动服务[API]安装到全局login项。
  • 在较早的系统上,您可以通过将Apple事件发送到System Events进程来安装login项 [ 不是 全局login项 ]。 [所以这个也许从10.5开始就不再可靠了]
  • 在Mac OS X 10.5之前,没有支持安装全局login项的方法。 [哇! 太疯狂了。]

我相信很多应用程序(在10.5中launchd之前)用来直接操作loginwindow.plist文件。 不幸的是,他们中的很多人做错了 – 我不能告诉你我已经看到了多less个XML-half-binary-all-broken loginwindow.plist文件。

裂变是相当的现货。

还有一些额外的细节,在以下的计算器后添加到bash的login项目:

https://stackoverflow.com/questions/6947925/add-app-to-osx-login-items-during-a-package-maker-installer-postflight-script/7643260#7643260