. Краткая версия. Можно ли удалить вспомогательные инструменты, которые были установлены приложением (SMJobBless()
и т. Д.), Когда приложение будет удалено? Если да, то как?Удаление элементов, установленных пользователем .app, когда пользователь удаляет его, включая помощники SMJobBless.
Длинная версия:
Мак приложения мы развиваемся, к сожалению, требует прав администратора для выполнения случайной работы, и это также требует фоновой задачи, чтобы быть живыми для плагин других приложений для подключения к даже если приложение сам не работает (этот человек может быть непривилегирован). Приложение будет подписано с сертификатом удостоверения разработчика и распространено только за пределами App Store.
Мы хотели бы, чтобы приложение было «хорошим гражданином», насколько это возможно, также при удалении.
Для фоновой задачи мы используем элемент входа, созданный с использованием SMLoginItemSetEnabled()
. Это не удивительно, потому что обмен сообщениями XPC, похоже, не работает (вместо этого мы используем CFMessagePort
- альтернативные предложения приветствуются), но если пользователь удаляет приложение, элемент входа по крайней мере больше не загружается при следующем входе в систему , Я подозреваю, что в системе все еще есть след, но исполняемый файл внутри пакета .app используется, и когда это исчезает, элемент входа больше не запускается.
Для случайной операции, требующей прав администратора, у нас есть привилегированный вспомогательный инструмент, который наше приложение устанавливает с помощью SMJobBless()
и которое реализует именованную службу XPC, поэтому задача закручивается по требованию, когда она получает сообщение от основного приложение. Это то, что Apple рекомендует и описывает в своем Even Better Authorization Sample.
Вспомогательный исполняемый файл копируется в /Library/PrivilegedHelperTools/
по SMJobBless()
, а встроенный launchd.plist - в /Library/LaunchDaemons/
. Несмотря на то, что ОС имеет информацию о том, какое приложение «владеет» помощником, оно, похоже, не удаляет его, когда пользователь удаляет приложение. В примере Apple не говорится об удалении, кроме сценария uninstall.sh
, который, по-видимому, предназначен для использования только в процессе разработки. Нам не нужен этот помощник, пока приложение не работает, поэтому установка его как полномасштабного демон запуска немного переборщила, но мы также хотели бы избежать неоднократного раздражения пользователя запросом пароля. Кроме того, Apple советует против других форм запуска кода с правами администратора, чем SMJobBless()
в эти дни - например, SMJobSubmit()
отмечен как устаревший.
Итак, как мы очищаемся после себя?
Я нашел SMJobRemove()
, но (а) когда мы назовем это в нашем случае - вы не можете запустить код на удаление пакета .app, или можете? и (b) it doesn't actually seem to clean up.
только 2 вещей, которые я могу думать, не очень удовлетворительный:
- Своего рода деинсталлятор приложения или сценария. Но это кажется довольно уродливым.
- Не беспокойтесь об этом и просто оставите беспорядок, когда пользователь удалит наше приложение.
Как я уже упоминал, привилегированный вспомогательный инструмент работает только по требованию, когда он получает команду XPC. По крайней мере, он не использует ресурсы времени выполнения, когда это не нужно. Но да, я согласен, что не стоит оставлять файлы в системе пользователя, поэтому мой вопрос. – pmdj