如何在 Electron 浏览器中原生使用 Swift 脚本 – CodesCode

Electron为维护一个JavaScript代码库提供了灵活性,从而创建跨平台应用程序,支持Windows、macOS和Linux

Electron是使用Web技术(如HTML、CSS和JavaScript)构建厚客户端应用程序的框架。 Electron 提供了灵活性,以维护一个JavaScript代码库来创建支持Windows、macOS和Linux的跨平台应用程序。基本上,您只需编写一次,到处运行。

JavaScript几乎可以很好地满足应用程序中的所有功能需求,但是当需要与特定于操作系统的本机API进行交互时,问题就会出现。在使用基于Electron的浏览器时,我遇到了这样一个问题。有一个特定的要求,需要在Mac上以特定的时间间隔(几秒钟)找到一系列打开的应用窗口。Node或JavaScript没有提供从操作系统层面访问此信息的接口,因此我必须想出一个自定义解决方案。

初始解决方案

我最初通过编写 OSAScript 来解决这个问题。OSAScript能够提供Mac上打开窗口的列表,但我们在测试过程中发现的主要问题是CPU使用率的增加。由于OSAScript是在一个时间间隔内运行的,它导致CPU使用率提高了40-50%,因此这个解决方案是不可接受的。

接下来呢?

在搜索后,我找到了各种解决方案,比如:

  1. 使用Python Cocoa库(PyCocoa):这可以提供Python和Cocoa之间的接口,可以在JavaScript中使用
  2. JsCocoa库:我尝试了集成,但没有成功
  3. 自定义Flask服务器:有一些帖子可以在浏览器中运行一个自定义的Flask服务器,并从JavaScript中消费API

所有这些方法要么太繁琐,要么会导致更高的延迟和增加的应用程序大小。

解决方案

使用SWIFT和child_process.exec()最终,我决定编写一个使用Cocoa来识别进程窗口的原生SWIFT脚本,并使用Xcode Playground进行测试。SWIFT脚本将输出一个JSON,可以很容易地被使用和解析。测试完成后,我将其编译为一个可执行文件,使用

swiftc sample.swift -o sample

这为我提供了一个可执行文件 sample,可以使用 ./sample 运行并输出JSON。

下一步是将其捆绑到Electron中,并在 child_process.exec() 方法中使用。为了捆绑,在一个文件夹中放置这个文件,假设叫做 executable,并在捆绑代码时更新复制脚本,以包含这个文件的内容。一旦可执行文件存在于捆绑中,我将可执行文件路径提供给 child_process.exec() 命令。使用这个命令的回调,我成功地从SWIFT输出的JSON中获取了数据,以便在Electron应用程序中做出决策。

结果

这使得OSAScript引入的CPU开销从40%几乎降低到了0%

结论

  1. 为任何特定于操作系统的可执行文件(如Mac上的SWIFT)创建二进制文件
  2. 将此可执行文件打包到您的Electron应用程序中
  3. 使用 child_process 命令执行打包的二进制可执行文件
  4. 在Electron应用程序中使用响应来做出决策!

Leave a Reply

Your email address will not be published. Required fields are marked *