项目介绍:DarwinKit
概述
DarwinKit 是一个专为 Go 编程语言开发的工具包,旨在使用原生 Apple API 构建 macOS 应用。这个工具包让开发者可以使用 Go 语言创建本地应用程序,而无需依赖 XCode 或 Objective-C 的深入编码知识。
主要特性
-
与 Apple 框架的无缝集成:DarwinKit 能直接调用 Apple 提供的各种框架,这样开发者可以构建具有 macOS 原生功能的应用。
-
使用 Go 语言:开发者只需在安装了 XCode 和 Go 1.18 及以上版本的系统上运行,便可在一个
main.go
文件中编写程序。 -
示例代码快速体验:
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() { 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 }) }) }
通过简单的
go mod init helloworld
,go get github.com/progrium/darwinkit@main
和go run main.go
命令,便可以快速生成并运行一个 macOS 应用程序。
使用注意事项
- Apple 框架的理解:需了解 Apple 框架的工作原理,需要将 Objective-C 的示例代码转换为 DarwinKit 支持的 Go 代码。
- 内存管理:DarwinKit 涉及两种内存管理系统,所有的框架对象由 Objective-C 的内存管理处理。
- 调试复杂性:使用框架可能会触发异常,导致程序崩溃。因此,需要具备调试混合 Go 和 Objective-C 程序的能力。
- 线程管理:与 GUI 对象交互的 Goroutines 需要在主线程上调度操作,否则会出现崩溃。
DarwinKit 非常适合于简单程序的开发,但由于上述注意事项,暂不推荐用于大型或复杂程序。
示例与应用
DarwinKit 提供了一系列的示例和应用程序,用户可通过支持项目来获取高质量的示例启动程序。现有的项目示例有 LargeType、ScanDrop、SnowScape、LiveTemp、MenuSpacer 和 ClipTrail 等。
运行机制
DarwinKit 的核心是使用 cgo
和 libffi
库包裹的 Objective-C 运行时。这允许开发者与 Objective-C 对象和类进行交互,甚至不需要 Objective-C 本身的深入理解。
应用程序开发者通过将 Objective-C 的复杂调用封装成易于使用的 Go API,以便于便捷调用。
致谢与授权
DarwinKit 受到 Mikkel Krautz 和 Dong Liu 的项目启发。它是一个开放项目,使用 MIT 许可发布。需要注意的是,DarwinKit 并未得到 Apple 官方的支持或附属其开发。