如何使用 Go 构建简单的 Mac 应用程序
几年前,我启动了DarwinKit ,因为当时 Go 还没有与 Mac 原生 API 的绑定。我们慢慢地将这个项目转变为绑定和生成工具,希望有一天能完全覆盖所有 Apple API。上周发布的 v0.5.0是该项目迄今为止规模最大的一次发布:
- 绑定了33 个框架,几乎完全覆盖:
- 2,353 个班级
- 23,822 个方法和属性
- 9,519 个常量/枚举
- 543 个结构
- 在 API 中自动转换和使用原生 Go 内置类型
- 支持块参数作为具有正确类型参数的 Go 函数
- 预先制作的委托实现,您可以简单地设置 Go 函数
- 与 Objective-C 符号 1 对 1 映射,同时仍然符合 Go 的惯用语法
- 所有符号的文档,包括指向该符号的官方 Apple 文档的链接
- 为赞助商提供越来越多的高质量入门应用程序示例
下面是一个使用 DarwinKit 的简单示例,只需几行 Go 代码即可构建一个原生的 webview 窗口应用程序:
package main
import (
"github.com/progrium/darwinkit/objc"
"github.com/progrium/darwinkit/macos"
"github.com/progrium/darwinkit/macos/appkit"
"github.com/progrium/darwinkit/macos/foundation"
"github.com/progrium/darwinkit/macos/webkit"
)
func main() {
// runs macOS application event loop with a callback on success
macos.RunApp(func(app appkit.Application, delegate *appkit.ApplicationDelegate) {
app.SetActivationPolicy(appkit.ApplicationActivationPolicyRegular)
app.ActivateIgnoringOtherApps(true)
url := foundation.URL_URLWithString("https://github.com/sponsors/darwinkitdev")
req := foundation.NewURLRequestWithURL(url)
frame := foundation.Rect{Size: foundation.Size{1440, 900}}
config := webkit.NewWebViewConfiguration()
wv := webkit.NewWebViewWithFrameConfiguration(frame, config)
wv.LoadRequest(req)
w := appkit.NewWindowWithContentRectStyleMaskBackingDefer(frame,
appkit.ClosableWindowMask|appkit.TitledWindowMask,
appkit.BackingStoreBuffered, false)
objc.Retain(&w)
w.SetContentView(wv)
w.MakeKeyAndOrderFront(w)
w.Center()
delegate.SetApplicationShouldTerminateAfterLastWindowClosed(func(appkit.Application) bool {
return true
})
})
}
我们用不到 40 行代码就开发了一个原生 Mac 应用,无需打开 XCode 或使用 Objective-C。我认为这可能是目前为止 Apple API 绑定的最佳项目,甚至可能是在 Mac 上开发小型实用程序的最佳方式。很快,它甚至会扩展到其他 Apple 设备。
未来
DarwinKit 缺少一个重要部分:没有与 Apple 框架函数的绑定。幸运的是,大多数框架都是基于面向对象编程 (OOP) 构建的,我们目前在这方面提供了很好的绑定。但有些框架,尤其是底层框架,主要由函数组成。虽然有一种解决方法是使用 CGO(DarwinKit 正在努力帮助您避免使用 CGO),但我们正在努力为每个框架函数生成原生的 Go 函数绑定。
我们正在努力的另一项重要工作是让 DarwinKit 完全不使用 CGO!使用purego后,我们可以在不涉及 CGO 的情况下调用 Apple 框架。这将缩短构建时间,缩小二进制文件体积,并允许 DarwinKit 用于那些出于各种原因需要避免使用 CGO 的程序中。
对于 iOS 和移动开发者来说,我非常希望它能够在 iOS 上运行。事实上,它已经应该可以了!但我们目前只为 MacOS 生成了绑定。如果有人想帮助将它移植到 iOS 上,让大家可以用 Go 开发 Apple 移动应用,请联系我们!
在那之前,试着用我们目前掌握的知识构建一个应用吧。告诉我进展如何!
文章来源:https://dev.to/progrium/how-i-build-simple-mac-apps-using-go-104j