Просить пользователя о повышенных привилегиях и приложению приложения без сертификата разработчика Apple

По-видимому, начиная с 10.7, AuthorizationExecuteWithPrivileges устарел. Общий смысл информации, которую я собрал на этом, кажется, предлагает использовать функцию ServiceManagement.framework SMJobBless() для развертывания вспомогательного приложения.

Мое понимание этого заключается в том, что для этого потребуется сертификат разработчика, который будет приобретен у Apple, чтобы подписать код как моего приложения, так и вспомогательного процесса - или это не сработает. Это верно?

Я изначально использовал AuthorizationExecuteWithPrivileges, чтобы спросить у пользователя о повышенных привилегиях, поскольку они необходимы для доступа к другому запущенному процессу. Без этого мое приложение не может работать как неофициальный плагин, на который он намеревался. Действительно ли способ подписи кода - единственный способ перейти отсюда? Я пытаюсь избежать покупки сертификата разработчика из-за его чистой стоимости.

Кто-нибудь нашел альтернативные способы перезапуска приложения с повышенными привилегиями, конечно же, с разрешения пользователя?

Ответ 1

@CarlosP answer с кодом, чтобы избежать пути и аргументов:

- (BOOL)runProcessAsAdministrator:(NSString*)scriptPath
                    withArguments:(NSArray*)arguments
                           output:(NSString**)output
                 errorDescription:(NSString**)errorDescription {

    //Check path.
    if (![scriptPath hasPrefix:@"/"]) {
        @throw [NSException exceptionWithName:
                    NSInvalidArgumentException reason:@"Absolute path required." userInfo:nil];
    }

    //Define script.
    static NSAppleScript* appleScript = nil;
    if (!appleScript) {
        appleScript = [[NSAppleScript alloc] initWithSource:
            @"on run commandWithArguments\n"
             "  activate\n"
             "  repeat with currentArgument in commandWithArguments\n"
             "      set contents of currentArgument to quoted form of currentArgument\n"
             "  end repeat\n"
             "  set AppleScript text item delimiters to space\n"
             "  return do shell script (commandWithArguments as text) with administrator privileges\n"
             "end run"];
    }

    //Set command.
    NSAppleEventDescriptor* commandWithArguments = [NSAppleEventDescriptor listDescriptor];
    [commandWithArguments insertDescriptor:
        [NSAppleEventDescriptor descriptorWithString:scriptPath] atIndex:0];

    //Set arguments.
    for (NSString* currentArgument in arguments) {
        [commandWithArguments insertDescriptor:
            [NSAppleEventDescriptor descriptorWithString:currentArgument] atIndex:0];
    }

    //Create target & event.
    ProcessSerialNumber     processSerial   = {0, kCurrentProcess};
    NSAppleEventDescriptor* scriptTarget    =
        [NSAppleEventDescriptor descriptorWithDescriptorType:typeProcessSerialNumber bytes:&processSerial length:sizeof(ProcessSerialNumber)];
    NSAppleEventDescriptor* scriptEvent     =
        [NSAppleEventDescriptor appleEventWithEventClass:kCoreEventClass
                                                 eventID:kAEOpenApplication
                                        targetDescriptor:scriptTarget
                                                returnID:kAutoGenerateReturnID
                                           transactionID:kAnyTransactionID];
    [scriptEvent setParamDescriptor:commandWithArguments forKeyword:keyDirectObject];

    //Run script.
    NSDictionary*           errorInfo   = [NSDictionary dictionary];
    NSAppleEventDescriptor* eventResult = [appleScript executeAppleEvent:scriptEvent error:&errorInfo];

    //Success?
    if (!eventResult) {
        if (errorDescription)
            *errorDescription = [errorInfo objectForKey:NSAppleScriptErrorMessage];
        return NO;
    } else {
        if (output)
            *output = [eventResult stringValue];
        return YES;
    }

}

Обновление

В Yosemite do shell script просто вызывает версия AuthorizationExecuteWithPrivileges, встроенный в StandardAdditions.osax.

Можно предположить, что опция with administrator privileges для do shell script исчезнет, ​​когда AuthorizationExecuteWithPrivileges сделает.

Лично я просто просто позвоню AuthorizationExecuteWithPrivileges напрямую.

do shell script имеет преимущество получение процесса автоматически. Для этого требуется дополнительная работа с AuthorizationExecuteWithPrivileges.

Ответ 2

Является ли способ подписи кода действительно единственным способом перейти отсюда?

Насколько я знаю, нет надежной альтернативы AuthorizationExecuteWithPrivileges.

Он все еще отлично работает под Йосемити. Еще не пробовал El Capitan.

Вы можете попытаться изящно с ошибкой, если вызов уйдет в будущем.

Я пытаюсь избежать покупки сертификата разработчика из-за его чистой стоимости.

Хорошо, если это поможет, сертификат подписи кода будет действителен в течение нескольких лет.

Я уверен, что я разрешил свою учетную запись разработчика без каких-либо проблем.

Так это в основном $99 каждые пять лет.