10

我需要一种从作为安装程序的一部分运行的 postflight 脚本将应用程序添加到登录项的方法。它需要在 10.5+ 上工作。最好是在 bash 脚本中工作。我的应用程序已经需要管理权限。

我在这里找到的方法: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做点什么。但是,我不确定哪种方法是跨版本兼容性的最佳实践。

注意:我不想在我的应用程序中使用一些 Objective-C 代码来添加它。我需要安装程序来添加它。 目前,我所做的是在安装后启动应用程序,然后使用 LSSharedFileListRef 将其添加到代码中的登录项...可以在此处找到该方法的示例:How do you make your App open at login?. 这不好的原因是我需要在登录屏幕上通过命令行使用 Apple Remote Desktop 安装我的应用程序。因此,应用程序在安装后不需要自动启动。

4

2 回答 2

15

以下是我调查和试验的选项:

选项 1:使用登录项

这是我使用的方法。通过将以下行添加到您的 postflight 中,从 bash 文件中很容易做到这一点。

defaults write /Library/Preferences/loginwindow AutoLaunchedApplicationDictionary -array-add '{Path="/Applications/Your Application.app";}'

注意:如果您重新安装应用程序,您甚至不必担心添加重复项。loginwindow 进程在读取重复项时会删除它们。

我在 10.5、10.6 和 10.7 上对此进行了测试,
@noa 说这在山狮 (10.8) 上不起作用,尚未亲自确认。

选项 2:LaunchAgent

使用 Launch Agent 的独特后果是:

  1. 你的应用程序没有出现在登录项列表中,所以用户真的必须知道他们在做什么才能摆脱它
  2. 用户无法在不运行的情况下结束您的应用程序进程:launchctl unload /Library/LaunchAgents/com.your.package.plist

下面是一些可用于在 bash 文件中创建启动代理的代码:

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

选项 3:将 Obj-c 代码编译为二进制文件

我从未真正完成过这种方法。显然,这就是 Novell 采用的方法。本质上,您将创建一个基础应用程序,该应用程序调用从该解决方案引用的库: 您如何使您的应用程序在登录时打开?

其他

没有尝试过,但根据这篇文章,如果你想让它在 Tiger 上工作,你需要使用 AppleScript ..?我不能确认或否认这一点,但认为这个链接可能是相关的。 通过 AppleScript 在 Objective-C 中编辑 Mac OS X 登录项

于 2011-10-04T04:19:49.467 回答
3

有两种方法可以在登录时启动程序:

  1. 使用登录项
  2. 设置 LaunchAgent

LaunchAgent 是最简单的,您只需要一个 .plist 文件,告诉 launchd 加载您的程序,然后将该文件放在 /Library/LaunchAgents 中(作为安装包的一部分)。

登录项目有点麻烦,而且是每个用户的。

于 2011-09-13T12:18:56.763 回答