是否可以在Dock中的应用程序图标中打开沙箱应用程序中的承诺文件NSFilesPromisePboardType
? Dock图标正在接受掉落,但-application:openFile:
永远不会被调用。
我找到的唯一参考是预沙箱:Accepting iCal events dropped on my application's icon
雷达:// 47917787
让我们打破这个:NSApplication
和NSDocumentController
在NSDocument
的应用程序给你-application:openFile:
或-openDocumentWithContentsOfURL:display:completionHandler:
免费在NSFilenamesPboardType
和NSURLPboardType
滴。
注意:我认为这是使用kCoreEventClass
/ kAEOpenDocuments
和kInternetEventClass
/ 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);
像这里的任何其他承诺文件一样处理。