使用NSPasteboard数据启动应用程序

时间:2012-11-09 13:44:35

标签: cocoa nspasteboard appleevents

我想使用NSPasteboard数据启动应用程序(或使用AppleEvents发送给他们),就像在应用程序(或Dock)中拖放文件,文本,图像时在Finder中完成一样或调用应用程序中的数据。

像LSOpenFromURLSpec这样的启动服务功能仅适用于文件,我看到AppleEvents的任意参数都有一个选项,但我无法弄清楚如何使其工作。

另一个问题是沙盒,但我不确定它是否可能。

谢谢。

1 个答案:

答案 0 :(得分:2)

当你是接收者时,会发生什么取决于用户丢弃的内容:

  • 一个或多个文件

    该应用程序将发送一个或多个打开的文档Apple Events。在尝试使用文档控制器之前,NSApplication尝试向其应用委托发送至少一个(应该只有一个,但已经被破解了几个版本)消息。

  • 一个或多个网址(不是文件:方案)

    应用程序会发送一个或多个get-URL事件。您需要为此实现Apple Event处理程序。方便的是,这是the Apple Event handling documentation使用的示例。

  • 任何其他数据

    您需要implement a service。将根据类型自动检测将用于Dock drop的服务,并且我不知道它如何在多个匹配中选择;没有办法只指定某些服务可用于Dock。您猜对了NSPasteboard:您使用粘贴板实现I / O服务。


当你是发件人时:

  • 发送文件

    最简单的方法是使用Launch Services。这将代表您发送适当的Apple活动。

  • 发送网址

    再次,Launch Services将为您发送必要的Apple Events。实际上,在现代代码中,您可能会对文件和非文件URL使用相同的LSOpen API。

  • 发送任何其他数据

    由于接收应用程序必须实现服务,因此您必须perform a service

    困难的部分是发现:您需要知道要执行哪项服务,并且需要提供服务。我假设您知道要发送到哪个应用程序(模拟下载),这对于大多数打算发送到服务的人来说都是一个优势。我很确定你只需要查看目标应用程序的Info.plist,找到最符合你自己类型的服务。

    一个潜在的问题是您无法指定应用程序包。您必须希望目标应用程序的服务能够显示在“服务”菜单中,并且您必须自己确定正确的菜单项名称。 (尝试使用您自己的“服务”菜单中显示的内容来尝试派生通信。)即使您提供了正确的服务项目名称并且启用了服务,也无法保证服务将由应用程序执行。你正在看的捆绑包 - 它可能是一个不同的版本,甚至可能是(可能,取决于名称的构造方式)一个具有同名服务的不同应用程序。

    您可能需要file a Radar关于此事。