SMJobBless вызывает ошибку kSMErrorDomainFramework 5 - инструмент по указанному пути недопустим - PullRequest
7 голосов
/ 03 марта 2012

Запуск SMJobBless:

(PrefPane проекта xcode version 4 Build 4A304a)

SMJobBless(kSMDomainSystemLaunchd, @"com.coderama.coderamaHelper", authRef, &err);

Вызывает эту ошибку:

System Preferences[22312:903] Bless Error: Error Domain=kSMErrorDomainFramework Code=5 UserInfo=0x2005790e0 "The operation couldn’t be completed. (kSMErrorDomainFramework error 5 - The tool at the specified path is not valid.)"

Ниже приведены мои списки.

Может кто-нибудь расшифровать сообщение об ошибке, чтобы я мог попытаться устранить его? Я просмотрел все свои списки, чтобы убедиться, что имена совпадают.

coderama-info.plist:

<?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>CFBundleDevelopmentRegion</key>
    <string>English</string>
    <key>CFBundleExecutable</key>
    <string>${EXECUTABLE_NAME}</string>
    <key>CFBundleIconFile</key>
    <string></string>
    <key>CFBundleIdentifier</key>
    <string>com.coderama.${PRODUCT_NAME:rfc1034identifier}</string>
    <key>CFBundleInfoDictionaryVersion</key>
    <string>6.0</string>
    <key>CFBundleName</key>
    <string>${PRODUCT_NAME}</string>
    <key>CFBundlePackageType</key>
    <string>BNDL</string>
    <key>CFBundleShortVersionString</key>
    <string>1.0</string>
    <key>CFBundleSignature</key>
    <string>????</string>
    <key>CFBundleVersion</key>
    <string>1.0</string>
    <key>NSHumanReadableCopyright</key>
    <string>Copyright © 2012 coderama. All rights reserved.</string>
    <key>NSMainNibFile</key>
    <string>coderama</string>
    <key>NSPrefPaneIconFile</key>
    <string>show_wireframe_zoom_24.gif</string>
    <key>NSPrefPaneIconLabel</key>
    <string>coderama</string>
    <key>NSPrincipalClass</key>
    <string>coderama</string>
    <key>SMPrivilegedExecutables</key>
    <dict>
        <key>com.coderama.coderamaHelper</key>
        <string>identifier com.coderama.coderamaHelper and certificate leaf[subject.CN] = &quot;Joe Developer&quot;</string>
    </dict>
</dict>
</plist>

coderamaHelper-info.plist:

<?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>CFBundleIdentifier</key>
    <string>com.coderama.coderamaHelper</string>
    <key>CFBundleInfoDictionaryVersion</key>
    <string>6.0</string>
    <key>CFBundleName</key>
    <string>coderamaHelper</string>
    <key>CFBundleVersion</key>
    <string>1.0</string>
    <key>SMAuthorizedClients</key>
    <array>
        <string>identifier com.coderama.coderama and certificate leaf[subject.CN] = &quot;Joe Developer&quot;</string>
    </array>
</dict>
</plist>

coderamaHelper-Launchd.plist выглядит так:

<?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.coderama.coderamaHelper</string>
    <key>MachServices</key>
    <dict>
        <key>com.coderama.coderamaHelper.mach</key>
        <true/>
    </dict>
</dict>
</plist>

Ответы [ 4 ]

9 голосов
/ 08 ноября 2012

Я тоже обратился к этой ошибке, сначала проверьте снова шаги, объявленные в readme.txt проекта SMJobless:

  1. В приложении перейдите по адресу: Target / Build Phases / Copy Files и сделайте
    убедитесь, что параметры назначены правильно: Destination = wrapper,
    subpath = Contents / Library / LaunchServices и, наконец, загрузите
    демон или служба в проекте.
  2. В приложении перейдите в файл info.plist и проверьте наличие следующего ключа: «Инструменты, принадлежащие после установки» и установите его равным =
    идентификатор com.acme.MyService и лист сертификата [subject.CN] =
    «Мой сертификат». Вы должны заменить MyService и MyCertificate на
    ваши собственные.
  3. В инструменте помощника или демоне перейдите в файл info.plist. Здесь вы должны добавить несколько пар ключ / значение, первая из которых: «Клиенты разрешены добавить и удалить инструмент "который должен быть установлен на" идентификатор
    com.acme.MyApp и лист сертификата [subject.CN] = "MyCertificate"
    Помните, замените MyApp и MyCertificate вашими собственными.
  4. И наконец, убедитесь, что THE DAEMON встроен в сам исполняемый файл перед тем, как его собрать, это достигается следующим образом: В помощнике инструмент или демон перейти к target / Build Настройки / Связывание / Другие флаги компоновщика и добавьте следующее:

    -sectcreate
    __TEXT
    __info_plist
    MyDaemon / info.plist
    -sectcreate
    __TEXT
    _launchd_plist
    MyDaemon / myDaemon-launchd.plist

Обязательно замените MyDaemon для правильных значений вашей собственной разработки. Будьте осторожны с именами вашей информации и запускаемых файлов.

ВАЖНЫЙ СОВЕТ : ИМЯ ДЕЙМОНА ИЛИ СЛУЖБЫ ДОЛЖНО СООТВЕТСТВОВАТЬ ДАННОМУ ИМЯ, НАПИСАННОМУ В ФАЙЛАХ INFO.PLIST И LAUNCHD.PLIST В противном случае возникнет ошибка kSMErrorDomainFramework ошибка 5 - инструмент по указанному пути недопустимо.

5 голосов
/ 06 марта 2012

Разработчик Apple ответил мне, что SMJobBless работает только с приложениями.

3 голосов
/ 03 марта 2012

Эта ошибка возникает, когда вспомогательный инструмент не связан в правильном месте, и поэтому SMJobBless() не может найти инструмент для установки.В разделе Build Phases вашей основной цели приложения вы должны добавить фазу сборки Copy Files.Добавьте ваш вспомогательный инструмент, установите пункт назначения Wrapper и подпуть к Contents/Library/LaunchServices, и SMJobBless() сможет найти ваш вспомогательный инструмент.

1 голос
/ 04 марта 2012

Проверьте документацию для SMJobBless для списка требований. Я предполагаю, что вы пропустили шаг 1 (подпись кода как инструмента, так и вашего приложения) или шаг 5 (копирование инструмента в нужное место в оболочке приложения).

Кроме того, [NSString @"com.coderama.coderamaHelper"] не имеет смысла. Просто напишите @"com.coderama.coderamaHelper".

Если ничего не помогает, посмотрите, что делает пример кода , и следуйте его примеру.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...