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.

War es hilfreich?

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 über   NSWorkspace 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?

  
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top