Pregunta Colocar archivos prometidos en el icono de la aplicación en Dock


¿Es posible abrir archivos prometidos? NSFilesPromisePboardType en la aplicación de espacio aislado cuando se pasa al icono de la aplicación en Dock? El icono del Dock está aceptando la caída, pero -application:openFile: nunca se llama

La única referencia que encontré es pre sandbox: Aceptar los eventos de iCal soltados en el icono de mi aplicación


5
2017-11-19 00:51


origen


Respuestas:


Vamos a desglosar esto: NSApplication y NSDocumentController en NSDocument aplicaciones basadas te da -application:openFile: o -openDocumentWithContentsOfURL:display:completionHandler: gratis en caso de NSFilenamesPboardType y NSURLPboardType gotas.

Nota: yo pensar bajo el capó, esto se implementa con los controladores de eventos NSAppleEventManager para kCoreEventClass/kAEOpenDocuments y kInternetEventClass/kAEGetURL.

Desafortunadamente ellos no manejan NSFilesPromisePboardType.

Vamos a actualizar nuestro conocimiento de pasteboard: el pasteboard es compartido entre todas las aplicaciones. Hay tablas de pegar predeterminadas para tareas como copiar, buscar y arrastrar.

Cuando el arrastre comienza, la aplicación escribe en la mesa de trabajo de arrastre compartida. Así que todo lo que necesitamos ahora es una notificación sobre la caída en el icono de Dock.

Aquí es donde NSService entra en juego:

<key>NSServices</key>
<array>
    <dict>
        <key>NSMessage</key>
        <string>openService</string>
        <key>NSSendTypes</key>
        <array>
            <string>public.data</string>
        </array>
        <key>NSMenuItem</key>
        <dict>
            <key>default</key>
            <string>Open</string>
        </dict>
    </dict>
</array>

Y configurarlo en el código:

- (void)applicationWillFinishLaunching:(NSNotification *)notification
{
    [NSApp setServicesProvider:self];
}

- (void)openService:(NSPasteboard *)serviceBoard
           userData:(NSString *)userData
              error:(NSString **)error
{
}

Una advertencia es que el NSService el cartón no es el NSDragPboard cartón.

Pero todos son compartidos, por lo que solo podemos acceder al que queremos:

NSPasteboard *dragPboard = [NSPasteboard pasteboardWithName:NSDragPboard];

if ([[dragPboard types] containsObject:NSFilesPromisePboardType])
{
}

El siguiente problema es que no tenemos -[NSDraggingInfo namesOfPromisedFilesDroppedAtDestination:].

#import <ApplicationServices/ApplicationServices.h>

El buen viejo Carbon nos cubrió.

    PasteboardRef pboardRef = NULL;
    PasteboardCreate((__bridge CFStringRef)NSDragPboard, &pboardRef);
    PasteboardSetPasteLocation(pboardRef, (__bridge CFURLRef)temporaryDirectory);

    NSString *urlString = [dragPboard stringForType:(NSString *)kPasteboardTypeFileURLPromise];

    CFRelease(pboardRef);

Manejar como cualquier otro archivo de promesa de aquí en adelante.


6
2017-11-26 02:13