Добавьте приложение к 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:
- Ваше приложение не отображается в списке элементов входа, поэтому пользователь действительно должен знать, что он делает, чтобы от него избавиться
- Пользователь не может завершить процесс ваших приложений без запуска: 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
Есть два способа запустить программу во время входа в систему:
- Используйте элементы входа
- Настройте LaunchAgent
LaunchAgent является самым простым, все, что вам нужно, это файл.plist, который указывает launchd загрузить вашу программу, а затем поместить этот файл в /Library/LaunchAgents (как часть пакета установки).
Вход в систему - это немного больно, и это для каждого пользователя.