如何从应用B访问应用A的功能

时间:2010-10-05 21:56:37

标签: objective-c cocoa applescript

我想知道应用程序是否可以访问另一个应用程序的特定功能。 例如

  • 在safari / firefox / chrome中打开一个网址
  • 在当前浏览器标签中运行javascript
  • 播放/暂停itunes
  • 在Finder中重命名所选文件

我知道Applecript的存在,但我想知道这是否是我必须与这些应用程序和其他人交互的唯一方式

感谢

2 个答案:

答案 0 :(得分:7)

应用程序将其功能暴露给外部世界有三种主要方式。

  1. 一个是支持URL协议。要打开网址,只需使用NSWorkspace即可。有很多方法;如果某个应用注册了x-my-app://some-work等特定协议,您只需执行

    即可
    [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"x-my-app://some-work"] ];
    

    如果您要打开许多应用支持其协议(例如http)的网址,并且您想指定要使用的应用,请使用openURLs:withAppBundleIdentifier:options:additionalEventParamDescriptor:launchIdentifiers:

  2. 另一个是System Services。有了这个,应用程序可以在服务菜单和其他应用程序的上下文菜单中添加条目;你也可以通过编程方式调用它。

  3. 否则,它是通过Apple活动。 Applescript是处理它们的一种方式,但不是唯一的方法。它只是发布Apple活动的一种语言。有许多方法可以处理来自Cocoa的Apple事件,请参阅Apple的this detailed document

    基本上,应用程序可以将其内部导出为面向对象的方式(不仅仅是它的Objective-C层次结构;您可以通过{{1来控制它暴露了多少内部对象和方法等)文件。然后,另一个应用程序可以通过Apple事件使用这个面向对象的系统。

    要发送和接收Apple事件,您当然可以手动构建它们,但您可以使用更高级别的对象,例如

    要了解应用程序公开的方面,只需打开AppleScript编辑器并选择菜单文件→打开字典,然后选择一个应用程序。

  4. 现在,使用应用程序未通过任何这些方法公开的应用程序的功能相当困难。你还有一些解决方法。

    1. UI Scripting。这是通过将Apple Events发送到名为sdef的无头应用程序来完成的,这是OS X中的核心程序之一。这样,您可以通过编程方式模拟单击按钮,选择其他应用程序的菜单等。因此,几乎任何使用GUI与另一个应用程序可以做的事情都可以通过其他应用程序以编程方式完成要查看可从UI脚本访问的UI对象的层次结构,请使用XCode工具附带的实用程序

      System Events

      这是非常简陋的但是做得很好;如果您经常使用UI脚本,请考虑获取UI browser,正如Zygmunt建议的那样。

    2. 最后,如果您想使用其他应用的非GUI非曝光功能,您可以将代码注入其他应用。

答案 1 :(得分:1)

只是扩展Yuji的答案。如果您被迫使用UI脚本路径,那么可以使用一个很好的应用程序来分析界面 - hxxp://pfiddlesoft.com/uibrowser/。但是,您提到的示例应该公开一些API。

我可能还建议使用Sikuli hxxp://groups.csail.mit.edu/uid/sikuli/作为IDE来强有力地编写用户界面脚本。

对于一些通常来自GNU / Linux的应用程序,有D-BUS hxxp://en.wikipedia.org/wiki/D-Bus - 虽然我还没有在Mac上使用它。我还要引用维基百科关于Cocoa的信息“这是Mac OS X可用的五大API之一;其他的是Carbon,POSIX(用于BSD环境),X11和Java。” hxxp://en.wikipedia.org/wiki/Cocoa_%28API%29这只是进一步探索的一个简单提示,因为Yuji已经解释了对你的问题至关重要的Apple事件。