1

我想使用 NSPasteboard 数据启动应用程序(或使用 AppleEvents 发送给它们),就像在 Finder 中将文件、文本、图像拖放到应用程序(或 Dock 中)并启动或调用应用程序中的数据。

像 LSOpenFromURLSpec 这样的启动服务功能仅适用于文件,我看到 AppleEvents 的任意参数有一个选项,但我不知道如何使它工作。

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

谢谢你。

4

1 回答 1

2

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

  • 一个或多个文件

    向应用程序发送一个或多个打开的文档 Apple 事件。在尝试文档控制器之前,NSApplication 会尝试向其应用程序委托发送至少一条(实际上应该只有一条,但这已在几个版本中被破坏)消息。

  • 一个或多个 URL(不是文件:scheme)

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

  • 任何其他数据

    您需要实现一个服务。Dock drop 使用哪个服务是根据类型自动检测的,我不知道它是如何在多个匹配项中进行选择的;无法指定仅某些服务可用于 Dock。关于 NSPasteboard,您猜对了:您使用粘贴板实现 I/O 服务。


当您是发件人时:

  • 发送文件

    最简单的方法是使用启动服务。这将代表您发送相应的 Apple 事件。

  • 发送 URL

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

  • 发送任何其他数据

    由于接收应用程序必须实现服务,因此您必须执行服务

    困难的部分是发现:您需要知道要执行的服务,并且它需要可用。我假设您知道要发送到哪个应用程序(模拟拖放到),这对大多数打算发送到服务的人来说是一个优势。我很确定您只需要查看目标应用程序的 Info.plist 并找到与您自己的类型最匹配的服务。

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

    您可能需要就此提交 Radar 。

于 2012-11-09T18:51:55.433 回答