Как открыть документ с помощью приложения, запущенного через NSTask? - PullRequest
0 голосов
/ 26 марта 2010

Я устал от встроенной команды open Mac OS X, в основном потому, что она запускает программы с вашим действительным идентификатором пользователя вместо эффективного идентификатора пользователя; это приводит к тому, что sudo open Foo открывает Foo со связанным приложением с вашей учетной записью вместо учетной записи root, и это меня раздражает. Поэтому я решил сделать какую-то замену.

Пока что я добился успеха: я могу открыть любую программу в режиме open -a или open -b и, при необходимости, поддерживать ожидание. Я использую NSTask для этой цели.

Однако я бы тоже хотел открывать документы. Насколько я вижу, для этого нужно использовать NSWorkspace, но использование NSWorkspace для запуска программ приводит к тому, что они запускаются с учетными данными вашей учетной записи вместо учетных данных программы командной строки. Это именно то, что делает инструмент по умолчанию open, и именно то, чего я не хочу.

Итак, как я могу запросить программу, чтобы другая программа открыла документ без использования NSWorkspace? Из объекта NSTask у меня может быть идентификатор процесса, но это все.

1 Ответ

1 голос
/ 26 марта 2010

Надеюсь, это поможет:

- (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 и затем откройте файл через NSWorkspace раз ты знаешь, что это Бег? Или это запускает новый экземпляр приложения под вашим Пользователь

Оригинальный ответ:

ли

open -a SomeApplication SomeFile

работа

...