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

时间:2015-11-19 00:51:54

标签: macos cocoa drag-and-drop sandbox mac-app-store

在Dock中使用应用程序图标时,是否可以在沙盒应用程序中打开承诺文件NSFilesPromisePboardType? Dock图标正在接受放置,但永远不会调用-application:openFile:

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

rdar:// 47917787

1 个答案:

答案 0 :(得分:7)

让我们分解一下:基于NSApplication的应用中的NSDocumentControllerNSDocument可以免费-application:openFile:-openDocumentWithContentsOfURL:display:completionHandler: { {1}}和NSFilenamesPboardType丢弃。

注意:我想想这是用NSURLPboardType / kCoreEventClasskAEOpenDocuments / kInternetEventClass的NSAppleEventManager事件处理程序实现的。

不幸的是,他们无法处理kAEGetURL

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

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

这是NSFilesPromisePboardType发挥作用的地方:

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>

处理此处的任何其他承诺文件。