在没有Apple开发人员证书的情况下要求用户提升权限并提升应用程序

时间:2015-07-10 06:03:44

标签: objective-c macos osx-mavericks osx-yosemite

显然,从10.7开始,AuthorizationExecuteWithPrivileges已被弃用。我收集到的信息的一般要点似乎建议使用ServiceManagement.framework的{​​{1}}函数来部署帮助应用程序。

我对它的理解是,这需要从Apple购买开发人员证书,以便对我的应用程序和帮助程序进行编码 - 或者这不起作用。它是否正确?

我最初使用SMJobBless()要求用户提升权限,因为他们需要访问另一个正在运行的进程。没有它,我的应用程序无法作为其意图的非官方插件。代码签名方式真的是从这里开始的唯一方式吗?我试图避免购买开发人员证书,因为它的成本非常高。

有没有人找到任何替代方法来重新启动具有提升权限的应用程序,当然还有用户权限?

2 个答案:

答案 0 :(得分:3)

@CarlosP's answer使用代码来逃避路径&参数:

export JAVA_HOME=/usr/lib/jvm/java-8-oracle

<强>更新

在优胜美地,- (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's 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; } } 只会调用do shell script中嵌入的AuthorizationExecuteWithPrivileges StandardAdditions.osax

可以想象,with administrator privileges的{​​{1}}选项会在do shell script时消失。

就个人而言,我会继续直接致电AuthorizationExecuteWithPrivileges

AuthorizationExecuteWithPrivileges自动拥有version的优势。这需要一点reaping the process do shell script

答案 1 :(得分:2)

  

代码签名方式真的是从这里开始的唯一途径吗?

据我所知,AuthorizationExecuteWithPrivileges没有安全的替代方案。

在优胜美地之下仍然可以正常运作。还没有尝试过El Capitan。

如果将来呼叫消失,您可以尝试fail gracefully

  

我正试图避免购买开发人员证书,因为它的费用很高。

好吧,如果它有帮助,代码签名证书将有效数年。

我很确定我的开发者帐户会在没有任何问题的情况下失效。

所以每五年基本上99美元。