如何在 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%,因此这个解决方案是不可接受的。
接下来呢?
在搜索后,我找到了各种解决方案,比如:
- 使用Python Cocoa库(PyCocoa):这可以提供Python和Cocoa之间的接口,可以在JavaScript中使用
- JsCocoa库:我尝试了集成,但没有成功
- 自定义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%
结论
- 为任何特定于操作系统的可执行文件(如Mac上的SWIFT)创建二进制文件
- 将此可执行文件打包到您的Electron应用程序中
- 使用
child_process
命令执行打包的二进制可执行文件 - 在Electron应用程序中使用响应来做出决策!
Leave a Reply