SMJobBless ошибка

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

Error Domain=CFErrorDomainLaunchd Code=8 "Операция не может быть завершена. (CFErrorDomainLaunchd error 8.)

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

Кто-нибудь может мне помочь, пожалуйста!

Спасибо,

4 ответа

Проверьте следующие вещи:

1.Code

- (BOOL)blessHelperWithLabel:(NSString *)label
                       error:(NSError **)error {   

    BOOL result = NO;

    AuthorizationItem authItem      = { kSMRightBlessPrivilegedHelper, 0, NULL, 0 };
    AuthorizationRights authRights  = { 1, &authItem };
    AuthorizationFlags flags        =   kAuthorizationFlagDefaults              |
    kAuthorizationFlagInteractionAllowed    |
    kAuthorizationFlagPreAuthorize          |
    kAuthorizationFlagExtendRights;

    AuthorizationRef authRef = NULL;

    /* Obtain the right to install privileged helper tools (kSMRightBlessPrivilegedHelper). */
    OSStatus status = AuthorizationCreate(&authRights, kAuthorizationEmptyEnvironment, flags, &authRef);
    if (status != errAuthorizationSuccess) {
        NSLog(@"%@", [NSString stringWithFormat:@"Failed to create AuthorizationRef. Error code: %d", (int)status]);

    } else {
        /* This does all the work of verifying the helper tool against the application
         * and vice-versa. Once verification has passed, the embedded launchd.plist
         * is extracted and placed in /Library/LaunchDaemons and then loaded. The
         * executable is placed in /Library/PrivilegedHelperTools.
         */
        result = SMJobBless(kSMDomainSystemLaunchd, (CFStringRef)label, authRef, (CFErrorRef *)error);
    }
    return result;
}

2. Инструменты, принадлежащие после поля установки в info.plist(основное приложение)

helper bundle : identifier <Helper Bundle Identifier> and certificate leaf[subject.CN] = "Developer ID Application: xxxxx (YYXSFDHZ6W)"

3. Клиентам разрешено добавлять и удалять инструментальные поля в вспомогательном info.plist.

item 0 : identifier <Main App Bundle Identifier> and certificate leaf[subject.CN] = "Developer ID Application: xxxxxx (YYXSFDHZ6W)"

4. Проверьте MachServices, поданные в xxxxHelperTool-Launchd.plist.it должно быть

helper tool bundle : YES

1、 Вы можете использовать SMJobBlessUtil.py для проверки вашего приложения; может быть, это приведет к некоторому описанию ошибок, как dump malformed;

2 、 затем вы можете сравнить настройки проекта примера кода, найдя цель помощника other linker flags Посмотрите, должны ли вы установить это.

Найдите инструмент SMJobBlessUtil.py в (иначе замененном образце кода) образце кода SMJobBless: https://developer.apple.com/library/archive/samplecode/SMJobBless/Introduction/Intro.html

ПРИМЕЧАНИЕ: SMJobBless - это верный способ благословить работу. Старый способ AuthorizationExecuteWithPrivileges устарел и в ближайшее время будет активно избегаться. Пример кода "SMJobBless" устарел, потому что следующий пример кода превосходит во всех отношениях.

Хорошо, получите инструмент, а теперь получите текущий пример кода: https://developer.apple.com/library/archive/samplecode/EvenBetterAuthorizationSample/Introduction/Intro.html

Используйте сценарий SMJobBlessUtil.py, чтобы проверить и / или настроить содержимое Info.plist внутри вашей основной программы и помощника.

Основываясь на ошибке, я подозреваю, что, хотя вы создали списки свойств info и launchd, вы не проинструктировали компоновщик встроить их в исполняемый файл.

Вы делаете это, устанавливая переменную сборки OTHER_LDFLAGS к -sectcreate __TEXT __info_plist $(INFOPLIST_FILE) -sectcreate __TEXT __launchd_plist $(LAUNCHDPLIST_FILE) куда INFOPLIST_FILE а также LAUNCHDPLIST_FILE- переменные со значениями путей к этим двум файлам. В качестве альтернативы вы можете напрямую указать здесь пути к файлам, а не делать их своими собственными переменными сборки.

Если у вас все еще возникают проблемы с этим, в основном файле вспомогательного инструмента вы можете импортировать фреймворк EmbeddedPropertyList и заставить его распечатать значения для своей встроенной информации и списков свойств launchd. Для этого вам не нужно устанавливать исполняемый файл через SMJobBless, вы можете просто запустить исполняемый файл в обычном режиме из Терминала. В этом случае он не будет работать с правами root, но это нормально, если вы просто пытаетесь проверить, правильно ли встроены списки свойств.

Другие вопросы по тегам