Добавьте приложение к OSX "Элементы входа" во время сценария пост-полета установщика Package Maker

Мне нужен способ добавить приложение к элементам входа из скрипта postflight, который запускается как часть моего установщика. Надо работать на 10,5+. Желательно, чтобы это работало в скрипте bash. Мое приложение уже требует административных прав.

Подход, который я нашел здесь: элементы входа в Mac OS с аргументами? казалось, на правильном пути (включен ниже)... но не работал, когда я попробовал это в командной строке, и я не уверен, как сделать это установить для всех пользователей или если мне нужно добавить логику, чтобы проверить, если он уже добавлен в элементы автозагрузки перед вызовом этого кода.

#!/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... Пример такого подхода можно найти здесь: Как сделать приложение открытым при входе в систему?, Причина, по которой это не так, заключается в том, что мне нужно установить приложение с Apple Remote Desktop через командную строку, когда на экране входа в систему. Таким образом, приложение не должно запускаться автоматически после установки.

2 ответа

Решение

Вот варианты, которые я исследовал и экспериментировал с:

Вариант 1: использовать элементы входа

Это метод, который я использовал. Это очень легко сделать из файла 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. По сути, вы создали бы базовое приложение, которое вызывает библиотеки, на которые ссылается это решение: как сделать ваше приложение открытым при входе в систему?

Другой

Не пробовал, но согласно этому посту, если вы хотите, чтобы он работал на тигре, вам нужно использовать AppleScript..? Я не могу подтвердить или опровергнуть это, но подумал, что эта ссылка может быть актуальной. Редактирование элементов входа в Mac OS X в Objective-C через AppleScript

Есть два способа запустить программу во время входа в систему:

  1. Используйте элементы входа
  2. Настройте LaunchAgent

LaunchAgent является самым простым, все, что вам нужно, это файл.plist, который указывает launchd загрузить вашу программу, а затем поместить этот файл в /Library/LaunchAgents (как часть пакета установки).

Вход в систему - это немного больно, и это для каждого пользователя.

Другие вопросы по тегам