Wie ein Dokument zu öffnen, eine Anwendung über NSTask ins Leben gerufen mit?
-
22-09-2019 - |
Frage
Ich habe genug von dem eingebauten in open
Mac OS X Befehl gewachsen, vor allem, weil es läuft Programme mit Ihrem tatsächlichen Benutzer-ID anstelle der effektiven Benutzer-ID; Daraus ergibt sich die Tatsache sudo open Foo
öffnet Foo mit den damit verbundenen Anwendung mit Ihrem Konto anstelle des root
Konto, und es ärgert mich. Also habe ich beschlossen, eine Art Ersatz zu machen.
Bisher habe ich erfolgreich: ich jedes Programm unter der open -a
oder open -b
Art und Weise öffnen kann, und unterstütze optional warten. Ich verwende NSTask
für diesen Zweck.
Allerdings würde Ich mag auch zu öffnen Dokumente zu können. Soweit ich sehen kann, müssen Sie NSWorkspace
dafür verwenden, aber auf Programme starten Ergebnisse in ihnen mit NSWorkspace
mit Ihrem Konto Anmeldeinformationen gestartet werden statt Ihr Befehl Anmeldeinformationen des Zeilenprogrammes. Welches ist genau das, was das Standard-open
Werkzeug tut, und genau das, was ich nicht will.
Also, wie kann ich ein Programm Anfrage, dass ein anderes Programm ein Dokument öffnet, ohne NSWorkspace
zu verwenden? Vom NSTask
Objekt, kann ich die Prozess-ID haben, aber das war es.
Lösung
Hoffentlich wird dies den Trick tun:
- (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);
}
Sie müssen möglicherweise die Anwendung starten eine
NSTask
mit und senden Sie es dann das geeignete offenes Apple-Ereignis.Eigentlich kann man startet eine mit
NSTask
und öffnen Sie dann die Datei überNSWorkspace
einmal wissen Sie, es ist Laufen? Oder macht starten, dass eine neue Instanz der Anwendung unter dem Benutzer?Original Antwort:
Does
open -a SomeApplication SomeFile
Arbeit?