Проверьте, является ли приложение элементом входа в систему под OS X Yosemite
В моем приложении Mac я использовал SMCopyAllJobDictionaries()
, чтобы проверить, будет ли приложение запускаться автоматически при входе в систему. В основном, я получаю массив всех элементов входа и проверяю, находится ли мой идентификатор Bundle в массиве.
Этот вызов функции работает до Mavericks, но устарел в Yosemite. Согласно Apple,
Эта процедура устарела и будет удалена в будущей версии. Не будет замены.
Однако, как я могу выполнить ту же работу в Йосемити? Мне нужно проверить, включено ли мое приложение в список элементов входа, чтобы правильно установить флажок. Я не смог найти соответствующую документацию от Apple.
Ответы
Ответ 1
После некоторых исследований выяснилось, что на этот период нет простого ответа. После тестирования нескольких приложений, включая F.lux и BetterSnapTool, я смог легко удалить свои пользовательские интерфейсы из системных настроек. Если я включу "запуск при запуске" в любом из этих приложений, затем удалите их из раздела системных настроек в разделе "Элементы", затем перезапустите их, их интерфейсы по-прежнему считают, что они запускаются при запуске. Взаимодействие с их флажками ничего не делает, поскольку приложения пытаются удалить себя из списка, к которому они больше не принадлежат, и требуется сделать второй щелчок.
Для меня это означает, что они сохраняют свое собственное внутреннее состояние как BOOL и сохраняют его между запусками и что просто не удается синхронизировать список с Yosemite. Если кто-то знает иначе, я дам им щедрость.
Ответ 2
Начиная с WWDC 2017, инженеры Apple заявили, что это все еще предпочтительный API для использования.
Однако использование этого API приведет к сбою сборки. Не выключайте все устаревшие функции. Вместо этого, чтобы ваше приложение могло скомпилировать, заверните SMCopyAllJobDictionaries
следующим образом:
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
CFArrayRef cfJobDicts = SMCopyAllJobDictionaries( kSMDomainUserLaunchd );
#pragma clang diagnostic pop
Если эта проблема важна для вашего приложения, и вы хотите, чтобы Apple предоставила чистое решение, пожалуйста, подайте радар; это помогает инженерам Apple определять приоритеты рабочих элементов.
Ответ 3
Я использую LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL)
для аналогичной цели. См. Ответ Ник Мур на Как сделать свое приложение открытым при входе в систему? для примера.
Обратите внимание, что это работает для элементов входа, но может не работать для заданий запуска.