macos – 将承诺的文件放到Dock中的应用程序图标上

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

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

解决方法

让我们分解一下:基于NSDocument的应用程序中的NSApplication和NSDocumentController为您提供了-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);

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

相关文章

我正在用TitaniumDeveloper编写一个应用程序,它允许我使用Ja...
我的问题是当我尝试从UIWebView中调用我的AngularJS应用程序...
我想获取在我的Mac上运行的所有前台应用程序的应用程序图标....
我是一名PHP开发人员,我使用MVC模式和面向对象的代码.我真的...
OSX中的SetTimer在Windows中是否有任何等效功能?我正在使用...
我不确定引擎盖下到底发生了什么,但这是我的设置,示例代码和...