【问题标题】:Launching application with NSPasteboard data使用 NSPasteboard 数据启动应用程序
【发布时间】:2012-11-09 13:44:35
【问题描述】:

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

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

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

谢谢。

【问题讨论】:

  • 所以你只是想启动一个特定的应用程序并发送一个文件来打开它?
  • 我知道如何启动文档,但我对其他数据感兴趣,例如文本、他们可能接受的图像(如 info.plist 文档类型中所定义)。基本上我想以编程方式将一些数据拖放到另一个应用程序上,并获得与将数据拖放到 Finder 中的应用程序上相同的效果。

标签: cocoa nspasteboard appleevents


【解决方案1】:

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

  • 一个或多个文件

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

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

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

  • 任何其他数据

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


当您是发件人时:

  • 发送文件

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

  • 发送网址

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

  • 发送任何其他数据

    因为接收应用程序必须实现一个服务,所以你必须perform a service

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

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

    您可能想file a Radar 了解此事。

【讨论】:

  • 这解决了目标应用程序如何响应下降,但我对如何从我的应用程序打包数据并以某种方式将其“发送”到另一个应用程序(即拖动到)感兴趣将调用相同的响应(取决于发送的数据)。使用文件和 URL 可以使用启动服务,但我不知道如何以某种方式对任意数据执行此操作,AppleEvents 除外。谢谢。
  • @GenericPtr: 哦。我什至早就明白了,然后忘记了。对不起。我会更新我的答案。
  • 我不认为服务是正确的路线,因为许多应用程序可以接受各种数据类型的丢弃,但他们没有为它们注册任何服务。我在自己的应用程序中执行此操作,例如接受文本拖动以创建新文件。
  • 没关系!我注册了一项服务来接受文本拖动。如果我必须通过没有捆绑 ID 的菜单项名称调用服务,那么我看不到这可能如何工作,并且可能需要阅读我认为在沙盒中不可能的 info.plists。允许 TextEdit 接受文本的服务名为“包含选择的新 TextEdit 窗口”,但它不会出现在“服务”菜单中(与我的应用程序使用的服务相同)。谢谢。
  • @GenericPtr:除非指定上下文(即使上下文规范为空),否则默认禁用每个服务。在 TextEdit 的情况下,这可能是有意的,也可能不是有意的。无论如何,您可以在键盘预面板中打开系统上存在的任何服务。
猜你喜欢
  • 2013-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-11
  • 2019-03-07
  • 2011-12-04
  • 2010-09-30
相关资源
最近更新 更多