如何使用通过NSTask启动的应用程序打开文档?

时间:2010-03-25 23:32:00

标签: objective-c cocoa macos nstask

我已经厌倦了内置的open Mac OS X命令,主要是因为它使用您的实际用户ID而不是有效的用户ID来运行程序;这导致sudo open Foo打开Foo及其关联的应用程序与您的帐户而不是root帐户,这让我很烦恼。所以我决定做出某种替代。

到目前为止,我已经成功了:我可以以open -aopen -b方式打开任何程序,并支持可选等待。我正在使用NSTask来实现这一目的。

但是,我也希望能够打开文档。据我所知,您需要使用NSWorkspace,但使用NSWorkspace启动程序会导致使用您的帐户凭据而不是命令行程序的凭据启动它们。这正是默认的open工具所做的,也正是我不想要的。

那么,如何让程序请求另一个程序在不使用NSWorkspace的情况下打开文档?从NSTask对象,我可以获得进程ID,但这就是它。

1 个答案:

答案 0 :(得分:1)

希望这可以解决问题:

- (void)openFile:(NSString *)filePath withTask:(NSTask *)task {
    int pid = [task processIdentifier];
    NSAppleEventDescriptor *target = [NSAppleEventDescriptor descriptorWithDescriptorType:typeKernelProcessID bytes:&pid length:sizeof(pid)];

    const char *urlUTF8 = [[[NSURL fileURLWithPath:filePath] absoluteString] UTF8String];
    NSAppleEventDescriptor *urlDescriptor = [NSAppleEventDescriptor descriptorWithDescriptorType:typeFileURL bytes:urlUTF8 length:strlen(urlUTF8)];

    NSAppleEventDescriptor *event = [NSAppleEventDescriptor appleEventWithEventClass:kEventParamAppleEvent eventID:kAEOpen targetDescriptor:target returnID:kAutoGenerateReturnID transactionID:kAnyTransactionID];
    [event setParamDescriptor:urlDescriptor forKeyword:keyDirectObject];

    OSStatus err = AESendMessage([event aeDesc], NULL, kAENoReply | kAENeverInteract, kAEDefaultTimeout);

    if (err != noErr) {
        // Error handling goes here
    }

    // Activate the application

    event = [NSAppleEventDescriptor appleEventWithEventClass:kAEMiscStandards eventID:kAEActivate targetDescriptor:target returnID:kAutoGenerateReturnID transactionID:kAnyTransactionID];
    err = AESendMessage([event aeDesc], NULL, kAENoReply | kAENeverInteract, kAEDefaultTimeout); 
}
  

您可能必须启动该应用程序   使用NSTask然后发送它   适当的开放式Apple Event。

     

实际上,你可以使用   NSTask然后通过打开文件   {1}}一旦你知道了   运行?或者这是否会推出一个新的   您的应用程序的实例   用户?

     

原始回复:

     
    

确实

         

NSWorkspace

         

工作?