ScriptingBridge —与Swift和AppleScript进行通信

对于开发人员和高级用户而言, AppleScript是macOS上的一项出色技术。 借助AppleScript,用户可以创建可运行其他应用程序的自动化流程。 但是,作为开发人员,有时您希望使用AppleScript的功能在Xcode中构建应用程序,而无需使用单独的脚本文件。 这就是ScriptingBridge出现的地方。

要在任何应用程序中使用AppleScript,有两种方法可以执行此操作:

  1. 编写一个单独的AppleScript文件,并使用NSAppleScript API执行和运行脚本。
  2. 使用ScriptingBridgeSwiftObjective-C中使用AppleScript。

我们将看第二个选项:ScriptingBridge。 特别是, 如何在Swift中使用ScriptingBridge而不需要AppleScript文件或事件Objective-C桥接。

如果您打算为Mac App Store编写应用程序,则有 Apple指出的 限制 您还可以查看Craig Hockenberry的这篇文章,其中展示了如何在Mac Store应用中使用AppleScript API。 最重要的是: 不能将ScriptingBridge与Mac App Store中的应用程序一起使用。

关于Objective-C ScriptingBridge ,Apple已经提供了准备代码的工具。 幸运的是, Majesty Software的 Tony Ingraldi 拥有 大量的Python脚本 ,可以在Swift中创建相同的代码。 有关此内容的更多详细信息,请查看他在GitHub上的仓库或此处的博客文章。

现在,让我们尝试通过编写 一个将选项卡网址从Safari窗口中拉出的应用程序来执行此操作 可以在这里找到该应用的仓库。

从AppleScript定义构建Swift代码

从GitHub上的SwiftScripting存储库下载python脚本工具。 在仓库的目录中,运行以下命令:

  pip install clangsdef /Applications/Safari.app> Safari.sdefsdp -fh --basename Safari Safari.sdef./sbhc.py Safari.h./sbsc.py Safari.sdef 

让我们分解一下:

  1. pip install clang –确保为python安装了clang
  2. sdef /Applications/Safari.app > Safari.sdef –从指定的可编写脚本的应用程序中获取脚本定义
  3. sdp -fh --basename Safari Safari.sdef –将脚本定义转换为Objective-C头文件
  4. ./sbhc.py Safari.h –将Objective-C头文件转换为Swift
  5. ./sbsc.py Safari.sdef –将标准定义中的枚举提取到Swift

现在您应该有4个新文件:

  • Safari.sdef-脚本定义文件
  • Safari.h —目标-c标头文件,如果我们直接进行目标-c或使用目标-c桥接将使用该文件
  • Safari.swift —包含应用程序主要ScriptingBridge API的主文件
  • SafariScripting.swift -ScriptingBridge API为应用程序所需的必要枚举

由于我们仅使用Swift代码,因此我们的应用程序中仅需要两个Swift文件(Safari.swift和SafariScripting.swift)。

将这两个文件添加到使用Xcode的项目中,现在在我们的应用程序中,我们可以与Safari进行通讯了。

要拉出当前打开的所有Safari窗口:

 如果让应用程序= SBApplication(bundleIdentifier:“ com.apple.Safari”){让safariApplication =应用程序作为SafariApplication let safariWindows = safariApplication.windows?()。flatMap({$ 0 as?SafariWindow})...} 

我们使用包标识符来调用SBApplication构造函数。 如果返回了一个对象,我们将其SafariApplicationSafariApplication协议并获取所有窗口。 windows属性仅返回SBElementArray ,因此我们需要将这些元素SafariWindow转换为SafariWindow

因此,通过使用SafariWindow,我们可以获得窗口的选项卡集:

 让safariWindow = safariWindows?.firstlet safariTab = safariWindow?.tabs?()。firstObject as?  SafariTablet url = safariTab?.URL 

因此,让我们分解一下:

  1. let safariWindow = safariWindows?.first –获取第一个Safari窗口
  2. let safariTab = safariWindow?.tabs?().firstObject as? SafariTab let safariTab = safariWindow?.tabs?().firstObject as? SafariTab –抓取Safari窗口的第一个标签并将其投放到SafariTab
  3. let url = safariTab?.URL –获取该特定选项卡的URL

如果您需要更多详细信息,请查看名为jURLnal的示例应用程序的存储库,该应用程序将URL复制到剪贴板。

如您所见-

  1. 我们已经使用标准的ScriptingBridge工具来构建Safari的AppleScript API的标准定义和Objective-C头文件。
  2. 通过使用Majesty Software的Tony Ingraldi的一组python脚本,我们可以将Objective-C头文件和标准定义转换为Swift代码。
  3. 将这两个Swift文件添加到我们的项目中,我们可以使用API​​提取当前打开的Safari应用程序的窗口和标签。

如果您想了解更多有关Swift和ScriptingBridge的信息,请在此处注册表格。


最初于 2018年11月16日 发布在 learningswift.brightdigit.com