gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 18:05:46 27 4
gpt4 key购买 nike

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

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

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

那么,如何让一个程序请求另一个程序打开一个文档而不使用 NSWorkspace 呢?从 NSTask 对象中,我可以获得进程 ID,但仅此而已。

最佳答案

希望这能解决问题:

- (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);
}

You may have to launch the application using an NSTask and then send it the appropriate open Apple Event.

Actually, can you launch using an NSTask and then open the file via NSWorkspace once you know it's running? Or does that launch a new instance of the application under your user?

Original reply:

Does

open -a SomeApplication SomeFile

work?

关于objective-c - 如何使用通过 NSTask 启动的应用程序打开文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2520190/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com