Добавление приложения в элементы входа в 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 через командную строку на экране входа в систему. Таким образом, приложение не должно запускаться автоматически после установки.


person blak3r    schedule 04.08.2011    source источник


Ответы (2)


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

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

Это тот метод, который я использовал. Это очень легко сделать из файла bash, добавив следующую строку в свой postflight.

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

Примечание. Вам даже не придется беспокоиться о добавлении дубликатов, если вы переустановите приложение. Процесс loginwindow удаляет дубликаты при их чтении.

Я тестировал это на 10.5, 10.6 и 10.7
@noa говорит, что это не работает на Mountain lion (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

person blak3r    schedule 04.10.2011
comment
В случае LaunchAgent вы сделали несколько хороших замечаний относительно взаимодействия с пользователем. Я думаю, Apple хочет, чтобы вы выполняли внутреннюю обработку в своем приложении и использовали любой подходящий пользовательский интерфейс, чтобы пользователь мог запускать что-то при входе в систему или нет. - person w00t; 10.10.2011
comment
С другой стороны, Dock позволяет вам щелкать приложения правой кнопкой мыши и добавлять / удалять их из элементов входа в систему в разделе Параметры. - person w00t; 10.10.2011
comment
Хорошо аргументировано и представлено, +1. - person Jan; 12.10.2012
comment
@noa, спасибо, я добавил предупреждение. Я посмотрю, как мы это делаем в 10.8, и доложу. Какой подход вы выбрали? - person blak3r; 13.03.2013
comment
Спасибо, я ценю это. Я склоняюсь к варианту 3 - написанию утилиты командной строки, чтобы сделать то же самое. В качестве альтернативы, возможно, AppleScript, хотя он мне нужен в элементах глобального входа, и я не уверен, что это можно сделать с помощью AppleScript. Я где-то читал, что AppleScript API устарел. В любом случае я не могу найти никаких официальных документов или доказательств. Кстати, вот вопрос, который подтвердил мои выводы по 10.8: stackoverflow.com/questions/9483959/osx- 10-8-loginitems - person paulmelnikow; 13.03.2013
comment
@noa, вариант 1, я почти уверен, что у нас все еще работает в 10.8 ... Я не уверен на 100%, но попробую подтвердить. - person blak3r; 09.05.2013
comment
Хм, интересно. По моему опыту, он работает только под 10.8, если строка находится в списке во время обновления с 10.7. - person paulmelnikow; 09.05.2013

Вы можете запустить свою программу при входе в систему двумя способами:

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

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

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

person w00t    schedule 13.09.2011