Подтвердить что ты не робот

Проверьте, является ли приложение элементом входа в систему под OS X Yosemite

В моем приложении Mac я использовал SMCopyAllJobDictionaries(), чтобы проверить, будет ли приложение запускаться автоматически при входе в систему. В основном, я получаю массив всех элементов входа и проверяю, находится ли мой идентификатор Bundle в массиве.

Этот вызов функции работает до Mavericks, но устарел в Yosemite. Согласно Apple,

Эта процедура устарела и будет удалена в будущей версии. Не будет замены.

Однако, как я могу выполнить ту же работу в Йосемити? Мне нужно проверить, включено ли мое приложение в список элементов входа, чтобы правильно установить флажок. Я не смог найти соответствующую документацию от Apple.

4b9b3361

Ответ 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 определять приоритеты рабочих элементов.