Если целью приложения является поддержка загрузки видео с YouTube, ему, вероятно, не нужны повышенные привилегии. Если этого требует Youtube-dl, он может быть не лучшим кандидатом для внутренней серверной части приложения Ma c. Лучшим выбором может быть реализация его функциональности и / или поиск альтернативных API, которые позволят вам сделать это без повышенных привилегий (или python зависимости, если на то пошло).
Тем не менее, если вы действительно хотите запустите внешний инструмент с повышенными привилегиями, вам нужно будет использовать XP C для создания привилегированного вспомогательного инструмента и разрешить пользователю запускать его от имени администратора во время выполнения. Этот API немного эволюционировал в последних нескольких выпусках ОС и, в некоторой степени, по замыслу, я думаю, его нетривиально реализовать.
Большинство примеров кода находится в Objective- C, поэтому вам нужно научитесь пользоваться API-интерфейсами Objective- C от Swift - или напишите код повышения прав в Objective- C и оберните его в класс, который вы можете легко вызвать из Swift. Оболочка расширенного инструмента запускается как XPCService с помощью launchd, и ваше приложение связывается с ним через порт mach.
Полный код и настройка проекта выходят за рамки того, что будет соответствовать этому ответу, но вот пример метода настройки, реализованного в Objective- C, сокращенный от кода EvenBetterAuthorizationSample (комментарии и диагностические c прагмы удалены):
- (void)connectWithEndpointAndAuthorizationReply:(void(^)(NSXPCListenerEndpoint * endpoint, NSData * authorization))reply
{
[self.queue addOperationWithBlock:^{
if (self.helperToolConnection == nil) {
self.helperToolConnection = [[NSXPCConnection alloc] initWithMachServiceName:kHelperToolMachServiceName options:NSXPCConnectionPrivileged];
self.helperToolConnection.remoteObjectInterface = [NSXPCInterface interfaceWithProtocol:@protocol(HelperToolProtocol)];
self.helperToolConnection.invalidationHandler = ^{
self.helperToolConnection.invalidationHandler = nil;
[self.queue addOperationWithBlock:^{
self.helperToolConnection = nil;
NSLog(@"connection invalidated");
}];
};
[self.helperToolConnection resume];
}
[[self.helperToolConnection remoteObjectProxyWithErrorHandler:^(NSError * proxyError) {
NSLog(@"connect failed: %@ / %d", [proxyError domain], (int) [proxyError code]);
reply(nil, nil);
}] connectWithEndpointReply:^(NSXPCListenerEndpoint *replyEndpoint) {
reply(replyEndpoint, self.authorization);
}];
}];
}
А вот текущая ссылка на полную пример проекта: https://developer.apple.com/library/archive/samplecode/EvenBetterAuthorizationSample/Introduction/Intro.html
В ветке форума разработчиков Apple говорится, что это должно быть возможно из Swift: https://developer.apple.com/forums/thread/99151
Вот еще один SO резьба на топи c: Приложение, Связь с помощником