在Dock中使用应用程序图标时,是否可以在沙盒应用程序中打开承诺文件NSFilesPromisePboardType
? Dock图标正在接受放置,但永远不会调用-application:openFile:
。
我发现的唯一参考是预沙箱: Accepting iCal events dropped on my application's icon
rdar:// 47917787
答案 0 :(得分:7)
让我们分解一下:基于NSApplication
的应用中的NSDocumentController
和NSDocument
可以免费-application:openFile:
或-openDocumentWithContentsOfURL:display:completionHandler:
{ {1}}和NSFilenamesPboardType
丢弃。
注意:我想想这是用NSURLPboardType
/ kCoreEventClass
和kAEOpenDocuments
/ 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>
处理此处的任何其他承诺文件。