我想使用NSPasteboard数据启动应用程序(或使用AppleEvents发送给它们),就像在查找器中一样,当您将文件、文本、图像拖放到应用程序(或在Dock中)时,查找器会启动或调用应用程序中的数据。
像LSOpenFromURLSpec这样的启动服务功能只对文件起作用,我看到有一个AppleEvents的任意参数的选项,但我不知道如何让它起作用。
另一个问题是沙箱,但我还不确定它是否可行。
谢谢。
发布于 2012-11-10 02:51:55
当你是接收者时,会发生什么取决于用户正在丢弃的内容:
向应用程序发送一个或多个打开的文档Apple事件。在尝试文档方案或多个URL(不是controller.
向应用程序发送一个或多个get-URL事件。为此,您需要实现一个Apple事件处理程序。为了方便起见,这是the Apple Event handling documentation使用的示例。
你需要使用implement a service。哪个服务将用于Dock drops是根据类型自动检测的,我不知道它是如何在多个匹配中选择的;没有办法指定只有某些服务可用于Dock。关于NSPasteboard,您猜对了:您使用粘贴板为I/O实现服务。
当你是发送者时:
最简单的方法是使用Launch Services。这将在您的behalf.
同样,Launch Services将为您发送必要的Apple事件。实际上,在现代代码中,您可能会对文件和非文件URLs.
由于接收应用程序必须实现服务,因此您也必须使用perform a service。
困难的部分是发现:你需要知道你想要执行哪个服务,并且它需要是可用的。我假设您知道将发送到哪个应用程序(模拟drop到哪个应用程序上),这对大多数打算发送到服务的人来说是一个助力。我敢肯定,您只需查看目标应用程序的Info.plist,然后找到与您自己的类型最匹配的服务。
一个潜在的问题是您不能指定应用程序包。您必须希望目标应用程序的服务能够显示在services菜单中,并且您必须自己找出正确的菜单项名称。(尝试一下您自己的服务菜单中显示的内容,以尝试派生出对应关系。)即使您提供了正确的服务项目名称并且服务已启用,也不能保证服务将由您正在查看的捆绑包中的应用程序执行-它可能是不同的版本,甚至(可能,取决于名称的构造方式)具有相同名称的不同应用程序。
你可能想要对此进行file a Radar。
https://stackoverflow.com/questions/13309244
复制相似问题