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

G3z*_*G3z 3 cocoa applescript objective-c

我想知道是否以及有多少方式应用可以访问另一个应用的特定功能.例如

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

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

谢谢

Yuj*_*uji 8

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

  1. 一种是支持URL协议.要打开URL,只需使用NSWorkspace.有很多方法; 如果一个应用程序注册了一个特定的协议x-my-app://some-work,你可以这样做

    [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"x-my-app://some-work"] ];
    
    Run Code Online (Sandbox Code Playgroud)

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

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

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

    基本上,应用程序可以将其内部导出为面向对象的方式(不仅仅是它的Objective-C层次结构;您可以通过文件控制其公开的内部对象和方法的数量等)sdef.然后,另一个应用程序可以通过Apple事件使用这个面向对象的系统.

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

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

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

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

    /Developer/Applications/Utilites/Accessibility Tools/Accessibility Inspector.app
    
    Run Code Online (Sandbox Code Playgroud)

    这是非常简陋的,但做的工作; 如果您经常使用UI脚本,请考虑获取UI浏览器,正如Zygmunt所建议的那样.

  2. 最后,如果您想使用另一个应用程序的非GUI非曝光功能,您可以将代码注入另一个应用程序.