Ошибка при включении автоматического входа в приложение mac os с помощью помощника

Я пытаюсь запустить автозапуск приложения при входе в систему после учебника Tim: http://blog.timschroeder.net/2012/07/03/the-launch-at-login-sandbox-project/

Я выполнил инструкции к письму, но я получаю сообщение об ошибке при повторном подключении к своему компьютеру следующим образом:

Jan 10 12:55:01 pc61 com.apple.xpc.launchd[1] (com.myApp.macgap.helper[25725]): Could not resolve CFBundleIdentifier specified by service: -10814: com.myApp.macgap.helper
Jan 10 12:55:01 pc61 com.apple.xpc.launchd[1] (com.myApp.macgap.helper): Service only ran for 0 seconds. Pushing respawn out by 10 seconds.

Наброски:

  • У меня есть мое основное приложение под названием "myApp" (ID: com.myApp.macgap)
  • В этом приложении у меня есть вспомогательное приложение с ID: com.myApp.macgap.helper
  • Когда вы запускаете основное приложение и переходите к настройкам, у вас есть возможность включить автоматический вход в систему (чтобы соответствовать правилам соответствия Apple).
  • Я выхожу из своего компьютера, заходим в систему и смотрю на консоль, чтобы узнать, что происходит (как я получил код выше)

Еще один момент, который стоит упомянуть, заключается в том, когда я делаю "Показывать содержимое пакета" в приложении и дважды щелкаю по вспомогательному приложению, он запускает основное приложение...

Ответы

Ответ 1

У меня была точно такая же проблема только сейчас, и, ища решение, нашел этот (неотвеченный) вопрос.

По крайней мере, в моем случае эта желаемая функциональность работала нормально, когда я скопировал приложение (экспортированное из Xcode как dev-id, подписанное .app), в новую установку/учетную запись OS X без всяких моих разработок. Конечно, он также должен быть в /Applications, как указано в уроке, упомянутом в вопросе.

Я не уверен, почему эта функция приложения не работала на моей машине разработки. Возможно, проблема может быть связана с какой-то формой конфликта со всеми другими почти идентичными копиями моего приложения, которое у меня есть на диске (у меня есть архив различных версий приложения, а также копии Xcode), все с одинаковыми конечно, идентификатор пакета.

Надеюсь, это помогает так или иначе!

Ответ 2

Все сводится к тому, как работают startd и launchctl, как уже было сказано, регулярный случай использования часто может быть решен путем переустановки приложения и обеспечения того, что приложение находится в папке приложений. Но есть еще один случай, о котором говорит @byb, когда это происходит на вашей машине разработки - это может быть вызвано неправильной конфигурацией запуска.

При запуске SMLoginItemSetEnabled он регистрирует ваш идентификатор пакета вместе с другой информацией в службе запуска. В какой-то момент позже, когда ваше приложение изменится, будет очищено или что-то еще произойдет с ним, которое будет получено при запуске, launchd может отключить этот конкретный элемент входа. По-видимому, иногда это не происходит гладко, а последовательные вызовы с SMLoginItemSetEnabled не будут работать, как ожидалось, или приложение agent/helper просто не запустится.

Первое, что нужно попробовать, это просто изменить идентификатор пакета для вашей пусковой установки. Если это решает проблему, попробуйте выяснить, что случилось с оригиналом. Запустите launchctl print-disabled "user/$(id -u)", чтобы отобразить отключенные службы и ассоциации элементов входа. Если вывод содержит ваш тревожный идентификатор пакета - вам повезло.

Я не нашел способ удалить отключенные службы по имени с помощью launchctctl и должен был сделать это, вручную отредактировав файлы конфигурации. Поскольку они принадлежат системе, вы не сможете просто щелкнуть и отредактировать, вместо этого запустите Xcode как root и удалите необходимые ссылки.

sudo /Applications/Xcode.app/Contents/MacOS/Xcode "/private/var/db/com.apple.xpc.launchd/loginitems.$(id -u).plist"
sudo /Applications/Xcode.app/Contents/MacOS/Xcode "/private/var/db/com.apple.xpc.launchd/disabled.$(id -u).plist"

Перезапустите, запустите launchctl print-disabled "user/$(id -u)", чтобы подтвердить, что удаленные элементы больше не входят в список. Попробуйте SMLoginItemSetEnabled снова, надеюсь, теперь он будет работать как ожидалось.

Ответ 3

У меня была такая же проблема, удалив другие экземпляры приложения, кроме одного в /Applications, решила проблему для меня. Чтобы удалить файлы .app, сгенерированные Xcode, вы можете запустить Product- > Clean.

Ответ 4

Я не могу найти дубликат, но нашел, что вы можете удалить эту услугу:

В окне терминала:

launchctl remove com.annoying.service

Ответ 5

Я боролся с этим часами. У меня было много приложений с авто логином, но новый просто не хотел работать. Странно работал на машине разработки:

1: Build App as normal
2: Move it to Application directory
3. Clean Xcode (CMD+k)!!
4. Enable auto login in the app.
5. Logout Login

Я случайно заметил, что система запустила приложение (он пробует каждые 10 секунд), когда я очищаю Xcode:)

Ответ 6

Как уже было сказано, если на компьютере запускается более одного экземпляра пакета услуг, не может решить, какой из них нужно запустить с помощью идентификатора пакета.

Я бы рекомендовал вам найти все копии вашего сервиса, а затем удалить ненужные.

Для этого вам нужно запустить следующий код Swift (он работает даже в Swift Playground):

import Cocoa

let bundleId = "com.your.bundleId"
let paths = LSCopyApplicationURLsForBundleIdentifier(bundleId as CFString, nil)
print("Available service instances by bundle id: \(paths)")

В моем случае он производит:

Available service instances by bundle id:
Optional(Swift.Unmanaged<__ObjC.CFArray>(_value: <__NSArrayI 0x6000002234a0>(
file:///Applications/MyApp.app/Contents/Library/LoginItems/MyService.app/,
file:///Users/igor/Library/Developer/Xcode/Archives/2017-12-27/MyApp%2027-12-2017,%2016.06.xcarchive/Products/Applications/MyService.app/
)
))

Итак, я легко идентифицировал копию, которую нужно удалить:

file:///Users/igor/Library/Developer/Xcode/Archives/2017-12-27/MyApp%2027-12-2017,%2016.06.xcarchive/Products/Applications/MyService.app/

Надеюсь, что это поможет.

Ответ 7

Предполагая, что вы следуете рецепту Тима Шредера по адресу: http://blog.timschroeder.net/2012/07/03/the-launch-at-login-sandbox-project/:

Что на самом деле закончило работать для меня, было, в Xcode, изменить мой основной номер сборки проекта от 1 до 2. Я также попробовал построить номер 1000, и это тоже хорошо работало.

В Xcode выберите главную цель проекта. Затем выберите вкладку "Общие". Если вы видите, что для вашей сборки установлено значение 1, измените ее на 2, а затем перестройте, перераспределите и посмотрите, разрешит ли это вам проблему.

Вероятно, это была одна из самых жутких ошибок, с которыми я столкнулся.