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, но это нормально, если вы просто пытаетесь проверить, правильно ли встроены списки свойств.