Mac-Osx

從 bash 腳本將應用程序添加到 OSX“登錄項”

  • October 4, 2011

我需要一種從作為安裝程序的一部分執行的 postflight 腳本將應用程序添加到登錄項的方法。它需要在 10.5+ 上工作。最好是在 bash 腳本中工作。我的應用程序已經需要管理權限。

我在這裡找到的方法: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做點什麼。但是,我不確定哪種方法是跨版本兼容性的最佳實踐。

裂變很到位。

在以下 stackoverflow 文章中,有一些關於從 bash 添加到登錄項的其他詳細資訊:

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

如果您不介意閱讀一下,我建議您從Apple Technical Note TN2083: Daemons and Agents開始。

我沒有測試過它,但我相信做你想做的最簡單的方法是通過*launchdagent*。這基本上涉及將plist文件放入/Library/LaunchAgents. 這樣做的一個很好的附帶好處是,您可以隨心所欲地多次覆蓋同一個文件,並且您不應該獲得項目的多個實例(每個使用者)。

就像是:

   #!/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

另一種可能性是全域登錄項。從上面提到的技術說明中,我收集到:

  • 全域登錄項是在任何使用者登錄時啟動的登錄項。
  • 在 Mac OS X 10.5 及更高版本中,您可以使用共享文件列表界面安裝全域登錄項以啟動服務$$ API $$.
  • 在早期的系統上,您可以通過向程序發送 Apple 事件來安裝登錄項[不是全域登錄項]。System Events$$ So perhaps this no longer works reliably as of 10.5? $$
  • 在 Mac OS X 10.5 之前,不支持安裝全域登錄項的方式。$$ Wow! That’s crazy. $$

我相信很多應用程序(launchd在 10.5 之前)用於loginwindow.plist直接操作文件。loginwindow.plist不幸的是,他們中的很多人都做錯了——我無法告訴你我見過多少半 XML 半二進制全損壞的文件。

引用自:https://serverfault.com/questions/299075