使用 Mac API 并使用 Go 构建 Mac 应用程序

2025-06-10

使用 Mac API 并使用 Go 构建 Mac 应用程序

如果您使用 Apple 设备并且是一位 Go 程序员,或者正在考虑学习 Go,我们刚刚发布了一些非常酷炫的新功能。今天,我发布了macdriver的 alpha 版本,它是 Go 的 Objective-C 桥接器,可以绑定到常见的 Mac API。

macdriver 徽标

那些关注我上一篇关于80 行 Go 代码实现 Large Type 的文章的人可能已经找到了 macdriver。largetype 程序是 macdriver 的示例项目之一。

大号字体截图

macdriver 仓库中的另一个例子是这个小小的菜单栏附加组件(又称系统托盘或状态图标),它能给你一个番茄钟计时器。这个小程序用 macdriver 编写,同样 不到 80 行 Go 代码。

番茄工作法截图

最后,如果你一直在使用 Go 1.16 测试版,或者可以等待即将发布的版本,这里还有一个示例,它提供了一个带有透明背景的全屏 WebView,让你可以使用 Web 技术在屏幕上绘制叠加层等。Twitch 主播可能会喜欢这个。很酷吧?

多年的酝酿

macdriver 的初衷只是想用 Go 语言开发一些应用程序,这些应用程序可以使用 Mac 系统 API,比如 Cocoa,来制作 GUI 应用。不过,我现在的大部分工作都是用 Web 技术来做用户界面,比如 Electron。

去年,我用 Go 语言开发了 Electron 的替代技术栈,名为webview项目。该项目使用平台的原生浏览器引擎,并通过 webview 创建窗口。虽然该项目非常简单且跨平台,但并未优先考虑任何特定于平台的功能。

除此之外,如果你想在同一个程序中制作一个像番茄钟那样的小菜单小程序(这并不罕见),你可以找到另一个独立的跨平台 Go 库来处理系统托盘相关的内容,但这些一次性的库通常存在 API 不完善的问题。更重要的是,它们不可组合!你不能将系统托盘库与 webview 库一起使用,因为它们都假定拥有主 Cocoa 线程。

所以像往常一样,我很沮丧,因为没有一个更全面、更通用的解决方案。如果我想使用其他 Mac API 怎么办?难道还要等另一个不完整、不可组合的项目吗?不,我们在这里创造自己的未来。

我其实已经研究这个(以及很多其他东西)好几年了。我甚至找到了一个叫 Mikkel 的丹麦人2013 年写的Go 的 Objective-C 桥接器,可惜……它没用。

整个过程应该很简单。Objective -C 运行时实际上是一个名为 libobjc 的 C 库。因此,理论上,你应该能够使用 cgo 调用 libobjc,并像使用其他 C 库一样在 Go 中使用 Objective-C 对象。

不幸的是,libobjc 中的方法调用函数,为了使其对任何方法调用都通用,都是可变参数的(可以接受任意数量的参数)。Cgo 不支持可变参数函数调用!所以 Mikkel 做了一个汇编 hack,让几乎所有可变参数的 C 函数都可以调用。太棒了!但是自 2013 年以来,Go 运行时的变更破坏了这一点,他早就转向了其他项目。

下定决心后,我终于让可变参数 hack 重新工作了。我甚至忘了自己在 2018 年在 dev.to 上发过帖子了。虽然还有很多问题需要解决,但我还是把它搁置了,直到去年年初,当时我需要解决 webview 和系统托盘的可组合性问题。我引入了废弃的 objc bridge 包和我修复的可变参数包,并开始为一些更常见的 Mac API 制作原生的 Go 封装器。结果就是 macdriver!

好处

现在,你可以用 Go 编写快速、机器原生的二进制文件来执行 Mac 操作。我指的不仅仅是编写 MacOS 应用。许多 API 开辟了新的可能性。例如,我很高兴能够在新的 M1 设备上使用 Core ML API 与神经引擎配合使用。

另一个好处是能够使用 Go 构建工具链快速构建 Mac 应用。不再需要 Xcode!只需go build……

下一步

我很期待看到大家如何使用 macdriver。README 里有更多关于如何使用它的信息,但我还在编写文档。目前文档应该基本能理解,但欢迎在论坛提问

如果你有兴趣和我一起探索新的可能性,我一直想尝试用 macdriver 开发一个 Apple Watch 应用。Mikkel 的原始桥接包里有一个 iOS 概念验证,但我还没试过。假设它能用(可能需要用到 Xcode 或其他开发者工具),那么它似乎也适用于 Apple Watch,甚至……Apple TV。

感谢您的阅读,祝您玩得开心,并考虑赞助我的作品

鏂囩珷鏉ユ簮锛�https://dev.to/progrium/use-mac-apis-and-build-mac-apps-with-go-ap6
PREV
🛑 您可以使用 7 个演示网站来执行 API 测试?
NEXT
像专业人士一样开始使用 Git - 在团队中使用 Git 的实践课程 [免费]