我想知道一个应用程序是否以及以多少方式可以访问另一个应用程序的特定功能。 例如
- 在 safari/firefox/chrome 中打开一个 url
- 在当前浏览器选项卡中运行 javascript
- 播放/暂停 iTunes
- 在 Finder 中重命名选定的文件
我知道 applescript 的存在,但我想知道这是否是我必须与这些应用程序和其他应用程序交互的唯一方式
谢谢
最佳答案
应用程序主要通过三种方式向外界公开其功能。
一个是支持 URL 协议(protocol)。要打开 URL,只需使用
NSWorkspace
。有很多方法;如果一个应用程序注册了一个特定的协议(protocol),比如x-my-app://some-work
,你可以这样做[[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"x-my-app://some-work"] ];
如果你想打开一个 URL,其协议(protocol)(比如 http)被许多应用程序支持,并且如果你想指定要使用哪个应用程序,请使用 openURLs:withAppBundleIdentifier:options:additionalEventParamDescriptor:launchIdentifiers: .
另一个是 System Services .有了这个,应用程序可以在服务菜单和其他应用程序的上下文菜单中添加条目;您也可以通过编程方式调用它。
否则,它是通过 Apple 事件。 Applescript 是处理它们的一种方法,但不是唯一的方法。它只是一种发布 Apple 事件的语言。 Cocoa 有很多方法可以处理 Apple 事件,参见 this detailed document苹果公司。
基本上,应用程序可以通过
将其内部导出为面向对象的方式(这不仅仅是它的 Objective-C 层次结构;您可以控制公开的内部对象和方法的数量等) sdef
文件。然后,另一个应用程序可以通过 Apple 事件使用这个面向对象的系统。要发送和接收 Apple 事件,您当然可以手动构建它们,但您可以使用更高级别的对象,例如
要了解应用公开了哪些方面,只需打开 AppleScript 编辑器并选择菜单文件 → 打开字典,然后选择一个应用。
现在,很难使用应用程序未通过任何这些方法公开的功能。您还有一些解决方法。
UI Scripting .这是通过将 Apple Events 发送到名为
System Events
的 headless 应用程序来完成的,该应用程序是 OS X 中的核心程序之一。这样,您可以通过编程方式模拟单击按钮、选择菜单等。另一个应用程序。因此,几乎任何您可以通过另一个应用程序使用 GUI 进行的操作都可以从另一个应用程序以编程方式完成。要查看可从 UI 脚本访问的 UI 对象的层次结构,请使用 XCode 工具附带的实用程序,网址为/Developer/Applications/Utilites/Accessibility Tools/Accessibility Inspector.app
这是非常基本的,但可以完成工作;如果您经常使用 UI 脚本,请考虑获取 UI browser ,正如 Zygmunt 建议的那样。
最后,如果您想使用另一个应用的非 GUI 非公开功能,您可以将代码注入(inject)另一个应用。
关于objective-c - 如何从应用程序 B 访问应用程序 A 的功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3868083/