将承诺的文件删除到Dock中的应用程序图标

问题描述 投票:5回答:1

是否可以在Dock中的应用程序图标中打开沙箱应用程序中的承诺文件NSFilesPromisePboardType? Dock图标正在接受掉落,但-application:openFile:永远不会被调用。

我找到的唯一参考是预沙箱:Accepting iCal events dropped on my application's icon

雷达:// 47917787

macos cocoa drag-and-drop sandbox mac-app-store
1个回答
7
投票

让我们打破这个:NSApplicationNSDocumentControllerNSDocument的应用程序给你-application:openFile:-openDocumentWithContentsOfURL:display:completionHandler:免费在NSFilenamesPboardTypeNSURLPboardType滴。

注意:我认为这是使用kCoreEventClass / kAEOpenDocumentskInternetEventClass / kAEGetURL的NSAppleEventManager事件处理程序实现的。

不幸的是他们没有处理NSFilesPromisePboardType

让我们刷新我们的粘贴板知识:粘贴板在所有应用程序之间共享。有复制,查找和拖动等任务的默认粘贴板。

当拖动开始时,应用程序将写入共享拖动粘贴板。所以我们现在需要的是关于Drop to Dock图标的通知。

这就是NSService发挥作用的地方:

<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>

并在代码中进行设置:

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

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

一个警告是NSService粘贴板不是NSDragPboard粘贴板。

但它们都是共享的,所以我们可以访问我们想要的那个:

NSPasteboard *dragPboard = [NSPasteboard pasteboardWithName:NSDragPboard];

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

下一个问题是我们没有-[NSDraggingInfo namesOfPromisedFilesDroppedAtDestination:]

#import <ApplicationServices/ApplicationServices.h>

好老碳让我们得到了保障。

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

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

    CFRelease(pboardRef);

像这里的任何其他承诺文件一样处理。

© www.soinside.com 2019 - 2024. All rights reserved.